mekatronik är nöjd med hjälpen
mekatronik 618
Postad: 16 dec 2021 13:29 Redigerad: 16 dec 2021 14:02

Assembler programmering; Morsekod med signaler

Hej, jag sitter med en uppgift just nu där jag skall programmera ett ljus som blinkar dessa följande morsekod mönster och har fastnat. Detta är mönstret den skall blinka (kort, lång);

Detta är koden som jag hittills tagit fram (i ordning);

Problemet här är att koden lyckas blinka fram error koden, dvs AA hexadecimalt vilket den skall göra men den kan inte blinka bokstäverna. Tanken är att hela denna skall skall lysa i kort och långa mönster som motsvarar bokstäverna;

Är det någon som vet vart det kan blivit fel? Jag använder en FLIS processor (http://www.cse.chalmers.se/edu/year/2014/course/EDA216/FlisProcessorHandbok-A4.pdf)

Detta är pseudokoden vi utgick ifrån för motsvarande delmoment;

ReadAscii:

BlinkLight:

Main (huvud delen)

edit: om jag låter programmet sitta en stund återgår värdet i A till $41 (hexadecimalt)

Mega7853 211
Postad: 16 dec 2021 14:15

Hur och vad stoppar du in för värde på inporten?
Är BMI verkligen rätt instruktion för att hoppa till Continue om A>0? Den hoppar ju om N=1 och det är väl om A<0? Kanske du kan prova med BGE här också.

mekatronik 618
Postad: 16 dec 2021 14:22
Mega7853 skrev:

Hur och vad stoppar du in för värde på inporten?
Är BMI verkligen rätt instruktion för att hoppa till Continue om A>0? Den hoppar ju om N=1 och det är väl om A<0? Kanske du kan prova med BGE här också.

Hej, vi har en 8 bitars funktion där vi kan trycka in värden i binär form (tog inte med bilden på den men jag kan lägga in värdena via den). 

Jag testade att byta ut BMI mot BGE, men tyvärr fastna programmet på error. Detta var resultatet:

Du kan se under bargraphen också hur jag för in värdena i inporten!

Mega7853 211
Postad: 16 dec 2021 14:30

Matar du in värden med DIP-switchen? Då ser det ut som att du matar in 0x41 så jag antar att du vill skriva "A". Men i instruktionerna står det att du ska skriva in ASCII-koden på de översta 7 bitarna och sedan flippa bit 0 för att trigga inmatningen.

mekatronik 618
Postad: 16 dec 2021 14:33
Mega7853 skrev:

Matar du in värden med DIP-switchen? Då ser det ut som att du matar in 0x41 så jag antar att du vill skriva "A". Men i instruktionerna står det att du ska skriva in ASCII-koden på de översta 7 bitarna och sedan flippa bit 0 för att trigga inmatningen.

Det är det som är tanken med BITA kommandot, men får det inte att fungera. Jag kan ju skriva in ASCII koderna via dipswitchen fast i binär form, men vart i koden behöver jag ändra då för att den skall kunna flippa bit 0?

Mega7853 211
Postad: 16 dec 2021 14:38

BITA kollar om bit 0 är satt, men sedan gör den LSRA, så resultatet av att skriva 0x41 på DIP-switchen blir att A=0x20.

Jag tycker att du borde skriva in 10000010 på DIP-switchen och sedan flippa bit 0 till 1 och tillbaka till 0 för att trigga en in-matning. Då borde A bli 0x41 efter ReadAscii.

mekatronik 618
Postad: 16 dec 2021 14:45
Mega7853 skrev:

BITA kollar om bit 0 är satt, men sedan gör den LSRA, så resultatet av att skriva 0x41 på DIP-switchen blir att A=0x20.

Jag tycker att du borde skriva in 10000010 på DIP-switchen och sedan flippa bit 0 till 1 och tillbaka till 0 för att trigga en in-matning. Då borde A bli 0x41 efter ReadAscii.

Kanske lite dum fråga, men vart i koden syftar du på att jag skall skriva in värdet? Dip switchen är denna apparat som jag trycker in värden manuellt: 

Mega7853 211
Postad: 16 dec 2021 14:48

Jag tänker inte att du ska skriva något i koden utan på DIP-switchen. Koden verkar vänta på att bit 0 på DIP-switchen sätts (BITA) och sedan skiftas bitarna på DIP-switch ner ett steg (LSRA) så resultatet av att trycka in 0x41 på DIP-switchen blir att A=0x20.

mekatronik 618
Postad: 16 dec 2021 15:06
Mega7853 skrev:

Jag tänker inte att du ska skriva något i koden utan på DIP-switchen. Koden verkar vänta på att bit 0 på DIP-switchen sätts (BITA) och sedan skiftas bitarna på DIP-switch ner ett steg (LSRA) så resultatet av att trycka in 0x41 på DIP-switchen blir att A=0x20.

Jaha! Då förstår jag, testade att trycka in 10000010 och sedan manuellt flippa den första biten (första från vänster) från 0 till 1 till 0 igen men hamnade i det här läget, dvs error:

Mega7853 211
Postad: 16 dec 2021 15:16

Kan du stega genom programmet med den där FLISP monitor? Det känns ju som att det borde fungera nu.

Om ReadAscii returnerar 0x41 så borde den passera både första och andra CMPA/BGE-testerna och komma till Continue.

Du kan ju prova att skriva ut värdet i A efter SUBA på displayen och trycka in olika värden för att se så att beräkningarna stämmer. 10000010 ska bli 00000000 och 10000100 ska bli 00000001. Men då måste du ju ta bort skrivningen till displayen i InfinityLoopAA.

mekatronik 618
Postad: 16 dec 2021 15:24
Mega7853 skrev:

Kan du stega genom programmet med den där FLISP monitor? Det känns ju som att det borde fungera nu.

Om ReadAscii returnerar 0x41 så borde den passera både första och andra CMPA/BGE-testerna och komma till Continue.

Du kan ju prova att skriva ut värdet i A efter SUBA på displayen och trycka in olika värden för att se så att beräkningarna stämmer. 10000010 ska bli 00000000 och 10000100 ska bli 00000001. Men då måste du ju ta bort skrivningen till displayen i InfinityLoopAA.

Precis, den flisp monitorn visar vart jag är i programmet. 

Testade att stega igenom programmet långsamt, efter att jag flippade den första biten från 0 till 1 fick A värdet 43. Sedan när jag kom till RTS fick A värdet 21 istället innan den går tillbaka till SUBA, såhär då:

Sen hamnar den i Error loopen av någon anledning

Mega7853 211
Postad: 16 dec 2021 15:31

Du skriver in 0x43 på DIP-switchen. De översta 7 bitarna är då 0x21 så beräkningarna stämmer. Men sedan subtraheras 0x41 från A och det jämförs med 0 och den hoppar till InfinityLoopAA.

Du ska istället skriva in 0x86 på DIP-switchen (så att de översta 7 bitarna bli 0x43) och sedan flippa bit 0.

mekatronik 618
Postad: 16 dec 2021 15:42
Mega7853 skrev:

Du skriver in 0x43 på DIP-switchen. De översta 7 bitarna är då 0x21 så beräkningarna stämmer. Men sedan subtraheras 0x41 från A och det jämförs med 0 och den hoppar till InfinityLoopAA.

Du ska istället skriva in 0x86 på DIP-switchen (så att de översta 7 bitarna bli 0x43) och sedan flippa bit 0.

Jag testade att skriva det, fick då ut $41 vilket då ladda A med 0 vid SUBA. Den första lampan tändes, däremot så skulle alla lampor, bit 0-7 tändas och blinkas. Räknaren fortsatte då i denna stil:

Mega7853 211
Postad: 16 dec 2021 16:01

Menar du att hela displayen ska tändas för varje streck i morse-koden? Då måste du skriva 0xFF till displayen och jag kan inte se att du gör det. Det måste du göra i BlinkLight.

I WhileCount måste du spara A på stacken innan du läser in Count. Du verkar inte heller göra någon jämförelse med Count, men det spelar nog ingen större roll just nu.

mekatronik 618
Postad: 16 dec 2021 17:50
Mega7853 skrev:

Menar du att hela displayen ska tändas för varje streck i morse-koden? Då måste du skriva 0xFF till displayen och jag kan inte se att du gör det. Det måste du göra i BlinkLight.

I WhileCount måste du spara A på stacken innan du läser in Count. Du verkar inte heller göra någon jämförelse med Count, men det spelar nog ingen större roll just nu.

Alla streck förutom de två sista skulle göra det, men vi gjorde precis som du sa och fick rätt. Tack för råden!

Programmeraren 3387
Postad: 16 dec 2021 18:43

Ska du lägga in kod för siffrorna 0-9 också?

mekatronik 618
Postad: 18 dec 2021 12:28
Programmeraren skrev:

Ska du lägga in kod för siffrorna 0-9 också?

Inte den här gången! Men om jag skulle göra det kunde jag använda den koden du tidigare hjälpte mig med, denna gången var det dock bokstäverna A-Z och error kod AA när man använde något utanför ascii intervallet som vi valde.

Svara Avbryt
Close