Forum: Mikrocontroller und Digitale Elektronik Assemblerprogram Blackout?


von Jo T. (Gast)


Lesenswert?

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
12
  sbi pinb,0      ; drv8801 wird benutzt
13
pr11:   ldi i,12    ; Preambel
14
pre:  
15
  ldi A,8   
16
  rcall Pause
17
  sbi pinb,1
18
  ldi A,8   
19
  rcall Pause
20
  cbi pinb,1
21
  dec i
22
   brne pre
23
loop:
24
  rjmp loop  ; zum Testen Endlosschleife
25
26
Pause: 
27
      ldi   r24,255
28
      ldi   r25,55
29
innen: 
30
      sbiw r24,1
31
      brne  innen
32
kurzPause:  dec A
33
      brne Pause
34
ret

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Editiere Deinen Beitrag und benutze die Formatierung.

von Peter II (Gast)


Lesenswert?

warum geht du nicht einfach mit dem Debugger durch?

von spess53 (Gast)


Lesenswert?

Hi

>  sbi pinb,1   !!!!!!!!!!!!!
>  ldi A,8
>  rcall Pause
>  cbi pinb,1   !!!!!!!!!!!!!

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Bist du sicher, dass du am PINB Register rumfummeln willst und nicht am 
PORTB?

von Jo T. (Gast)


Lesenswert?

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.

von der alte Hanns (Gast)


Lesenswert?

>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.

von kogitsune (Gast)


Lesenswert?

1
  rcall Pause

Stack initialisiert?

von Fred S. (kogitsune)


Lesenswert?

Oops, unangemeldet. Jetzt nicht mehr...

von Grüner (Gast)


Lesenswert?

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

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
Noch kein Account? Hier anmelden.