Bis vorhin funktionierte diese Programm bei mir: ;+---------------------------------------------------------------------- .include "m16def.inc" ;----------------------------------------------------------------------- - ;Reset and Interrupt vector ;VNr. Beschreibung rjmp main ;1 POWER ON RESET reti ;2 Int0-Interrupt reti ;3 Int1-Interrupt reti ;4 TC2 Compare Match reti ;5 TC2 Overflow reti ;6 TC1 Capture reti ;7 TC1 Compare Match A reti ;8 TC1 Compare Match B reti ;9 TC1 Overflow reti ;10 TC0 Overflow reti ;11 SPI, STC Serial Transfer Complete reti ;12 UART Rx Complete reti ;13 UART Data Register Empty reti ;14 UART Tx Complete reti ;15 ADC Conversion Complete reti ;16 EEPROM Ready reti ;17 Analog Comparator reti ;18 TWI (I²C) Serial Interface reti ;19 Store Program Memory Ready ;----------------------------------------------------------------------- - ;Start, Power ON, Reset main: ldi r16,low(RAMEND) out SPL,r16 ldi r16,high(RAMEND) out SPH,r16 ldi r16,0b11111111 out DDRC,r16 ;PORTA auf Ausgang out DDRB,r16 ;PORTB auf Ausgang out DDRB,r16 ;PORTC auf Ausgang ;----------------------------------------------------------------------- -- start: out PORTC,r20 ldi r16,0x01 out PORTB,r16 rcall loop ldi r16,0x02 out PORTB,r16 rcall loop jmp start loop: ldi R17, $12 WGLOOP0: ldi R18, $BC WGLOOP1: ldi R19, $C4 WGLOOP2: dec R19 brne WGLOOP2 dec R18 brne WGLOOP1 dec R17 brne WGLOOP0 ret Jetzt bleibt das Programm beim Aufruf des Unterprogrammes stehen ? Was ist passiert? Simuliere mit AVRStudio. Vielen Dank
Die Vektorentabelle muß statt der vielen reti ein "rjmp RESET" erhalten, wobei RESET die Sprungmarke zur ersten Adresse nach den Interruptvekoren ist. Außerdem paßt Deine Schleifenverschachtelung nicht. r19 wird immer wieder neu geladen, decrementiert, neu geladen... Da kommt der Controller nicht mehr heraus.
> Jetzt bleibt das Programm beim Aufruf des Unterprogrammes stehen Ein Programm auf einem µC kann nicht einfach stehen bleiben- > Simuliere mit AVRStudio. Hast du vielleicht "Single Step" F10 mit "Step into" F11 verwechselt? Wenn du mit einem F10 über den rcall drübersteppst, dann dauert das schon seine Zeit, bis der Simulator durch die Schleifen durchsimuliert hat.
> Die Vektorentabelle muß statt der vielen reti ein "rjmp RESET" > erhalten, Da keine Interrupts im Spiel sind, ist das erst mal egal. Selbst wenn da Interrupts wären ist an den reti erst mal nichts auszusetzen. > Außerdem paßt Deine Schleifenverschachtelung nicht. r19 wird immer > wieder neu geladen, decrementiert, neu geladen Neu geladen wird nur, nachdem die Schleifevariable in der Schleife eins weiter drausen um 1 runtergezählt wurde. Irgendwann sind diese verschachtelten Schleifen also zuende. Im Simulator dauert das seine Zeit, aber irgendwann kommt der call zurück.
Karl Heinz, hast Recht, die Schleifen sind irgendwann durch, hab´s mit den Augen ;-). Die retis da oben soll´er aber doch mal in "jmp Reset" (nicht rjmp...) ändern, sonst geht dann später auf einmal nix mehr...
> "jmp Reset" (nicht rjmp...) ändern
so wird ein Schuh draus :-)
Beim Mega16 sind die Interrupt Vektoren schon 2 Byte
gross.
Insofern ist die Aussage: 'An den reti ist erstmal nichts
auszusetzen' etwas gewagt. Um nicht zu sagen: falsch.
Am besten, der Lutz brennt den Kram mal und simuliert nicht, dann sieht er am ehesten, ob´s geht oder nicht ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.