Assemblerprogram Blackout?

Gast #3850006
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
Gast #3851100
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.
Gast #3851111
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.
Gast #3851611
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.