Hallo,
ich bin am Verzweifeln, nur jede zweite Schleife wird abgearbeitet.
Ich will ein DCC-Signal generieren.
Bitte schau mal ein Programmierer nach oder testet.
Ich habe eine Schleifenverlängerung eingebaut, so dass PB1 deutlich
sichtbar blinkt, aber nur 6 mal. Wo liegt mein Fehler?
Danke für die Mühe.
Guten Tag!
Hier das Testprogramm:
1
.include "tn13def.inc"
2
.def A = r16
3
.def i = r19
4
sbi ddrb,0 ;out-pwm (immer an)
5
sbi ddrb,1 ;out-dir
6
sbi ddrb,2 ;
7
cbi ddrb,3 ;dcc-in H-aktiv
8
cbi ddrb,4 ;schalter L-aktiv
9
ldi A,113 ;8620Hz bei 1sen
10
out OSCCAL, A
11
cbi pinb,0 ; Vorsicht beim Einschalten, AnalogFahrt
Ja danke Karl Heinz,
sbi pinb,1 ergibt wie gewünscht 12x Blinken.
pinb wird nur beim Lesen benutzt.
Das ich so 3 Jahre AVR-Programmierung geschafft habe,
u.a. mit IR-Empfangsprogramm und PWM-Motorsteuerung.
Nochmal Danke und Guten Abend.
>pinb wird nur beim Lesen benutzt.
Nicht ganz, und ist dieses nicht gerade der Grund für das 6-mal Blinken:
However, writing a logic one to a bit in the PINx Register, will result
in a toggle in the corresponding bit in the Data Register.
Wo is
reset_vector:
ldi temp,high(ramend) ;Stackpointer RAMend, Stack geht nach unten!
out SPH,temp
ldi temp,low(ramend)
out SPL,temp
des?
Dann würde ich Dir gleich mal empfehlen so einen Blödsinn mit einer
Schleife nicht zu schreiben. Sondern einen Timer zu benutzen der ist
frei Scallierbar und dder µC schläft wärend der ganzen Zeit.
Timer aufziehen
Timer starten
Int ena
init_sleep:
ldi temp,(1<<SE) ;Sleep Enable
out MCUCR,temp
clv ;clear carry
sei ;Global Int ena!!! Wichtig sonst geeht das ganze nicht.
TimInt Einsprung hart mit rjmp auf (siehe nächste Zeile)
Int in einem Register Markieren (sonst weist ja nicht welcher gekommen
ist)
(bei nur einem kleinen Programm ist das nicht notwendig aber wenn Du
z.B. mehrere Int hast dann immer Markieren und dann per Liste die jenige
Routine ausführen die der jeweilige Int erfordert.)
call Routine
ret
sleep ;Zzzzzz
MfG
Grüner