Forum: Mikrocontroller und Digitale Elektronik [ASM] Problem mit Verzweigungen


von Seb (Gast)


Lesenswert?

Hallo Zusammen,

Arbeite grad die Grundlagen der µC-Programmierung durch (mit ´nem 
STK500)

Aktuell programmiere ich ne Art "Frequenzgenerator" bei dem ne LED mit 
unterschiedlcihen Frequenzen (100Hz, 50Hz, 5Hz, 1Hz) "blinkt".

Dies soll durch das Betätigen von 2 Tastern gesteuert werden:
LED blinkt mit  1Hz , wenn beide Taster gedrueckt
                5Hz, wenn Taster1 gedrueckt
                50Hz, wenn Taster0 gedrueckt
                100Hz, wenn kein Taster gedrueckt
                (Bei Tastendruck wird PIN auf 0 gezogen)

Die Zeitschleifen zur Erzeugung der Frequenzen funktionieren. Aber die 
Verzweigungen am Anfang funktionieren nicht wie erwartet.
Das Programm scheint nur mit der 100Hz Schleife zu starten und bei 
Tastendruck ändert sich nichts. Beim Debuggen konnt ich auch nichts 
entdecken, dort funktionieren die Sprünge wie erwartet, wenn die PIND 
Bits entsprechend gesetzt sind.

Sieht jmd. nen Fehler oder hat ne Alternative für mich?

Gruß und danke vorab...
1
INIT:
2
.DEF  Temp1 =  r16    
3
.DEF  Mask  =  r17
4
.DEF  WL    =  r24    
5
.DEF  WH    =  r25
6
7
.EQU  LEDPin    = 0
8
.EQU  T0Pin    = 0
9
.EQU  T1Pin    = 1
10
11
    ;Def. Ausgaenge
12
    ldi Temp1, 0x00
13
    out DDRB, Temp1      
14
    sbi DDRB, LEDPin    ;LEDPin Bit in PORTB als Ausgang (1) setzen
15
    sbi PORTB, LEDPin    ;Ausgang auf HIGH setzen (LED gegen VCC - STK500)
16
17
    ldi Mask, 0x01      
18
19
    ;Def. Eingaenge
20
    ldi Temp1, 0x00
21
    out DDRD, Temp1      ;PORTD alle Pins als Eingang def.
22
    ldi Temp1, 0x03      ;0b0000 0011
23
    out PORTD, Temp1    
24
25
;-------------------------------------------------------------------------------------------------------
26
;    Hauptprogramm
27
;-------------------------------------------------------------------------------------------------------
28
MAIN:  in Temp1, PORTB
29
    eor Temp1, Mask    
30
 
31
    out PORTB, Temp1  
32
33
    in Temp1, PIND    ;Register PIND einlesen (Zustaende der Taster)
34
    cpi Temp1, 0x03
35
    breq F100HZ       ;PIND = 0b0000 0011 => springe zu F100HZ
36
    cpi Temp1, 0x02
37
    breq F50HZ        ;PIND = 0b0000 0010 => springe zu F50HZ
38
    cpi Temp1, 0x01
39
    breq F5HZ         ;PIND = 0b0000 0001 => springe zu F5HZ
40
    cpi Temp1, 0x00
41
    breq F1HZ         ;PIND = 0b0000 0000 => springe zu F1HZ
42
43
F100HZ:  ;Schleife fuer 100Hz LED Blinkfrequenz (5ms an / 5ms aus)
44
           ldi XL, 0x05
45
           ldi XH, 0x00  ;Startwert der aeusseren Wiederhol-Schleife
46
LOOP100HZ2:
47
           ldi WL, 0xD0
48
           ldi WH, 0x07  ;Startwert entspr. 1ms bei 8MHz
49
LOOP100HZ1:
50
           sbiw WL, 1    ;Dekrmentieren des Register W um 1
51
                  
52
           brne LOOP100HZ1 ;Zeitschleife bis W = 0
53
    
54
           sbiw X, 1
55
           brne LOOP100HZ2 ;Zeitschleife bis X = 0
56
57
    rjmp  MAIN      ;Endlosschleife
58
59
60
F50HZ:  ;Schleife fuer 50Hz LED Blinkfrequenz (10ms an / 10ms aus)
61
          ldi XL, 0x0A
62
          ldi XH, 0x00      ;Startwert der aeusseren Wiederhol-Schleife
63
LOOP50HZ2:
64
          ldi WL, 0xD0
65
          ldi WH, 0x07      ;Startwert 1ms bei 8MHz
66
LOOP50HZ1: 
67
          sbiw WL, 1        ;Dekrmentieren des Register W um 1
68
                  
69
          brne LOOP50HZ1    ;Zeitschleife bis W = 0
70
    
71
          sbiw X, 1
72
          brne LOOP50HZ2    ;Zeitschleife bis X = 0
73
74
    rjmp  MAIN      ;Endlosschleife
75
76
77
F5HZ:  ;Schleife fuer 5Hz LED Blinkfrequenz (25ms an / 25ms aus)
78
          ldi XL, 0x19
79
          ldi XH, 0x00      ;Startwert der aeusseren Wiederhol-Schleife 
80
LOOP5HZ2:
81
          ldi WL, 0xD0
82
          ldi WH, 0x07      ;Startwert 1ms bei 8MHz
83
LOOP5HZ1: sbiw WL, 1        ;Dekrmentieren des Register W um 1
84
                  
85
          brne LOOP5HZ1     ;Zeitschleife bis W = 0
86
    
87
          sbiw X, 1
88
          brne LOOP5HZ2     ;Zeitschleife bis X = 0
89
90
    rjmp  MAIN      ;Endlosschleife
91
92
93
F1HZ:  ;Schleife fuer 1Hz LED Blinkfrequenz (500ms an / 500ms aus)
94
         ldi XL, 0xF4
95
         ldi XH, 0x01      ;Startwert der aeusseren Wiederhol-Schleife 
96
LOOP1HZ2:
97
         ldi WL, 0xD0
98
         ldi WH, 0x07      ;Startwert 1ms bei 8MHz
99
LOOP1HZ1: sbiw WL, 1       ;Dekrmentieren des Register W um 1
100
                  
101
         brne LOOP1HZ1      ;Zeitschleife bis W = 0
102
    
103
         sbiw X, 1
104
         brne LOOP1HZ2      ;Zeitschleife bis X = 0
105
106
    rjmp  MAIN      ;Endlosschleife

von Dietrich L. (dietrichl)


Lesenswert?

Ich würde die nicht benutzten Portpins vor der Abfrage ausmaskieren. 
Denn wenn sie nicht beschaltet sind, ist ihr Zustand undefiniert. Oder 
Du schaltest die Pull-Ups ein, dann sind sie sicher "1".

Gruß Dietrich

von Seb (Gast)


Lesenswert?

Hi Dietrich,

das war´s Problem...hab jetzt die oberen Bits 7 bis 2 mit
1
andi Temp1, 0x03
 maskiert und das Ganze funktioniert.

Besten Dank

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.