Hallo,
ich bin Anfänger im Mikrocontroller-Bereich und habe bis jetzt folgende
Hardware:
-Pollin Evaluationsboard
-USB AVR Lab im usbasp Modus
-ATmega8 als Controller
An PORTD hängen an den Pins 5 und 6 je eine LED, an Pin 7 ein
Pieper.(Bedingt durch das Evaluationsboard) An Pin 0 und 1 sind die UART
Anschlüsse dran, an Pin 2,3,4 sind jeweils Taster dran.
Nun steuere ich zum Test den Buzzer an, welcher immer ein- und
augeschaltet wird, und zwar je nach Ergebnis des Vergleichs zwischen
einer Zählvariablen und einer festen Variablen. Wenn ich nun über einen
Interrupt(also Tastendruck) die Inkrementiervariable erhöhe, sodass die
Zählvariable pro Durchlauf mehr erhöht wird, passiert nichts, die
Tonhöhe des Piepers bleibt gleich. Ändere ich die Inkrementiervariable
aber per Hand im Init-Teil des Programmes, also vor der Schleife,
funktioniert dies fehlerfrei. (Nebenbei werden noch LEDs ein und
ausgeschaltet, dies ist aber nicht von Interesse und funktioniert wie
gewollt)
Hier mein Code: (Wichtig ist m.M.n. nur der Teil ab loop)
1
.include "m8def.inc"
2
3
.def temp = r16
4
.def beepinc = r17
5
.def beepcounter = r18
6
7
.org 0x000
8
rjmp main
9
.org INT0addr
10
rjmp int0_handler
11
.org INT1addr
12
rjmp int1_handler
13
14
15
main:
16
17
ldi temp, LOW(RAMEND)
18
out SPL, temp
19
ldi temp, HIGH(RAMEND)
20
out SPH, temp
21
22
ldi temp, 0b11100000
23
out DDRD, temp
24
25
ldi temp, (1<<ISC01) | (1<<ISC11) | (1<<ISC00) | (1<<ISC10) ; INT0 und INT1 auf fallende Flanke konfigurieren
26
out MCUCR, temp
27
28
ldi temp, (1<<INT0) | (1<<INT1) ; INT0 und INT1 aktivieren
Hi
> brsh piep1> brlo piep2>piep1:> sbi PORTD, 7> sbi PORTD, 6> ret>piep2:> cbi PORTD, 7> cbi PORTD, 6> ret
Du kannst nicht irgendwo hin springen, und dann versuchen mit 'ret'
wieder zurückzukommen. 'piep1' und 'piep2' kannst du nur mit 'rcall'
aufrufen.
MfG spess
Wo das Thema gerade noch aktuell ist habe ich noch eine Frage:
PORTD ist ja teilweise Ein-, teilweise Ausgang.
Was passiert wenn ich nun per in temp, PORTD die Eingänge abfrage?
Ich habe was ausprobiert, was aber nicht funktioniert, nach dem Prinzip
1
in temp, PORTD ;Eingänge auslesen
2
andi temp, 0b00000100 ;Alle bits außer bit 2 auf null setzen (bit 2 = taster)
3
cpi temp, 0b00000100 ;Vergleich
4
breq aufruf ;hier sollte das Programm zu der genannten Stelle springen, wenn der Taster gedrückt ist
Christian schrieb:> Wo das Thema gerade noch aktuell ist habe ich noch eine Frage:>> PORTD ist ja teilweise Ein-, teilweise Ausgang.> Was passiert wenn ich nun per in temp, PORTD die Eingänge abfrage?
Eingänge werden abgefragt, in dem man das PIND Register ausliest.
Ist ein Pin auf Eingang geschaltet, dann sagt dir das PORT Register für
diesen Pin, ob dort der Pullup Widerstand eingeschaltet ist.
Nochmal genauer studieren:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen
Ups das ist mir glatt wieder entfallen (Hab mir das Tutorial
durchgelesen, bevor ich alles zum programmieren zusammen hatte. Das mit
den Pullups wusste ich aber noch!)
Ok danke, ich quäl euch dann mal nicht länger ;)