Forum: Mikrocontroller und Digitale Elektronik ATMEGA8 assembler fehlermeldung


von Hans (Gast)


Lesenswert?

Bekomme die Fehlermeldung " ...... out of Range" doch ich kann den 
fehler nicht lokalisieren?
1
.include "m8def.inc"
2
3
.org 0x0000
4
  rjmp RESET
5
  rjmp BEGINN
6
  reti
7
  reti
8
  reti
9
  reti
10
  reti
11
  reti
12
  reti
13
  rjmp ZAEHLER
14
  reti
15
  reti
16
  reti
17
  reti
18
  reti
19
  reti
20
  reti
21
  reti
22
  reti
23
24
RESET:
25
26
    
27
    in r16, 0b01000000      ;Initialisierung des Analog Wandlers
28
    out ADMUX, r16
29
30
    in r20, 0b00000000      ;Zähler Wert für Entfernung auf 0 setzen
31
32
    in r16, 0b00000000      ;Gesamten PortC als Eingang konfigurieren
33
    out DDRC, r16
34
     
35
    in r16, 0b11111111      ;Pullups verwenden
36
    out PORTC, r16
37
38
    in r16, 0b11111111      ;PortB als Ausgang verwenden
39
    out DDRB, r16
40
41
    in r16, TIMSK        ;Timer konfigurieren
42
    ori r16, 1<<TOIE0
43
    out TIMSK, r16
44
45
46
47
    sei              ;Globale Interrupt Freigabe
48
49
BEGINN:
50
  
51
    sbis PC4          ;Abfrage des Schalter für Beginn der Messung
52
    rjmp SENDEN          ;Wenn Taster gedrückt ist Sendevorgang beginnen
53
    rjmp BEGINN          ;Taster erneut abfragen
54
55
SENDEN:
56
    
57
    in r16, 0b00000001      ;Timer zur Entfernungsmessung beginnt zu zählen
58
    out TCCR0, r16
59
60
    in r16, 0b00000001      ;Spannungsversorgung für den Sender aktivieren
61
    out PORTB, r16
62
63
    in r16, 0b01101101      ;Starten des Fast PWM Signals zur erzeugung einer ca. 40 kHz Frequenz
64
    out TCCR2, r16
65
66
67
    
68
    
69
70
71
ZAEHLER:
72
73
    push r16          ;R16 sichern
74
    in r16, SREG        ;SREG sichern
75
    push r16
76
77
    INC r20            ;Bei jedem Overflow das "Zählregister" um 1 erhöhen
78
79
    pop r16            ;R16 wiederherstellen
80
    out SREG, r16        ;Statusregister wiederherstellen
81
    pop r16
82
    reti            ;ISR verlassen

von H.Joachim S. (crazyhorse)


Lesenswert?

Was sollen die In-Befehle? LDI suchst du eigentlich.

von Hannes L. (hannes)


Lesenswert?

Und was soll die Endlosschleife in der ISR Beginn?

...

von Spess53 (Gast)


Lesenswert?

Hi

>    in r16, 0b01101101

Ein in-Befehl kann nur bis 63 adressieren. 0b01101101 entspricht 109. 
Aber du wolltest besstimmt kein 'in' benutzen, sondern 'ldi'.

MfG Spess

von H.Joachim S. (crazyhorse)


Lesenswert?

Stack-init fehlt auch ...:-)

von Uwe (Gast)


Lesenswert?

>sbis PC4
Gibt es nicht !
Syntax ist :
sbis ioregister,bit nr (0-7)
also :
sbis pinc,4
bzw. :
sbis pinc,PC4
finde ich aber Schwachsinn weil schon durch pinc der Port auf C 
festgelegt wurde.
Macht nur sinn wenn Pin 4 auf einer anderen Bitposition wie z.B. 7 
liegen könnte (bei unterschiedlichen Ports jeweils anders angeordnet).

von Karl H. (kbuchegg)


Lesenswert?

Und wie gehts am Ende von SENDEN weiter, nachdem der TCCR2 mit einem 
neuen Wert versorgt wurde?

von oldmax (Gast)


Angehängte Dateien:

Lesenswert?

Hi
Jungs, zerpflückt ihn doch nicht gleich....
Also, trenn erst einmal den Weizen von der Spreu, also werd dir klar, 
was ist mein Hauptprogramm und was sind die Unterprogramme oder 
Interrupt Service Routinen (ISR)
Nur der Aufruf einer ISR hat in der Interrupt Vector Table etwas zu 
suchen. Reti auch, da sie fehlgeleitete Interrupts zurückschubsen.
So, nun ich wieder. Nimm ein Blatt Papier und Zeichne auf, was du 
willst. Ich hab mal einen Vorschlag skizziert. Ist nicht der Weisheit 
letzter Schluß, aber ich denke, grad wenn man mit Assembler anfängt, 
verliert man doch schnell den Überblick. Solche Programmblöcke lassen 
sich wunderbar prüfen und dokumentieren.
Gruß oldmax

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.