oberallgeier
07.11.2007, 21:25
Hallo,
ich kann ein seltsames Phänomen nicht selber lösen. Hinweise in den Foren habe ich dazu nicht gefunden.
Aufgabe: Je eine LED an Port3 und Port4. Eine Taste an Port0 wird abgefragt. Ohne Tastendruck leuchtet nur die eine LED (grün), solange die Taste gedrückt wird, leuchtet nur die andere - rLED. Assembler, AVRStudio, flashen über RS232 nach dem Lernpaket, s.u.
Die Funktion ist korrekt am Experimentierboard (siehe Schaltschema, aus Lernpaket µC, Kainka) solange es an der RS232 hängt. Nach dem Reset leuchtet codegerecht die gLED, durch Tastendruck wird auf die rLED umgeschaltet.
;================================================= ==================================
; Deklarationen für den Praeprozessor und Konstanten (s.auch oben Speicherbelegung)
#include "tn13def.inc"
#define a r16 ;Kurzbezeichung für Allzweckregister r16
;
#define taste0 0 ;Taste0 auf PB0
#define rLED 3 ;Rote LED (auf Port PB3)
#define gLED 4 ;Grüne LED (auf Port PB4)
;================================================= ==================================
.org 0x0000 ;Interrupt Definition / I Handler Tabelle
; Code Labels Comments
rjmp reset ;Reset Handl. power-on, brown-out, watchdog
;================================================= ==================================
; Hauptprogramm
;================================================= ==================================
;
reset: ;=== Generelle Initialisierung
rcall mc_init
;
hauptpr: ;=== Löse Aufgabe: Teste Port PB0 auf Tastendruck
h2:
sbis pinb,taste0 ;Wenn Pinb_0 (0..7) = 1, dann rLED/PB3 einschalten
rjmp grnan ; sonst schalte die gLED/PB4 ein
rotan:
sbi portb,rLED ;Rote LED/PB3 an
cbi portb,gLED ; gLED/PB4 aus
rjmp tastende
grnan:
cbi portb,rLED ;Rote LED/PB3 aus
sbi portb,gLED ; gLED/PB4 an
;
tastende:
rjmp h2
;
;================================================= ==================================
; Prozeduren
;================================================= ==================================
;
;================================================= ==================================
; Initialisierungen
;================================================= ==================================
;
mc_init: ;=== Initialisiere Mikrocontroller
;ALLE Register initialisieren hier := pull-ups einschalten
;
ldi a,0b00111000 ;Datenrichtung "Eingänge" für ports 0 - 2
out ddrb,a ; und "Ausgänge" für ports 3 - 5
;
ldi a,0b00111000
out portb,a ; ports aus-(=) oder ein(1)schalten; low = sink
ret ;=====----->>>>>
;
;================================================= ==================================
; Ende des Quellcodes
;================================================= ==================================
Wenn ich die Schaltung (also die Platine nur umstecke) an einem 9V-Block laufen lasse, leuchtet sofort die rLED auf und lässt sich nicht mehr ausknipsen. Dabei ist es egal, ob ich die 9V am Anschluss RTS einleite oder, wie im Buch zum Lernpaket angegeben an DTR.
Eine Kontrolle der Spannungen ohne Peripherie und µC an der Platine mit angeschlossenem 9V-Block gab keine unerlaubten Spannungen an den 8 Pins.
Das Problem ist eigentlich aufgetaucht bei einer interruptgesteuerten Tastenabfrage mit Signalausgabe an einem Piezo. Daher hatte ich den beschriebenen Versuchsaufbau erstellt.
Der entsprechende Passus im datasheet
ATtiny13 (179 pages, revision H, updated 10/07) auf
http://www.atmel.com/dyn/resources/prod_documents/doc2535.pdf
auf S 45, Abschnitt Switching Between Input and Output - oberhalb table 19 - ist mir schon so einigermassen klar - aber ich verstosse offenbar nicht dagegen (Port wird ja nur aus- und eingeschaltet - nicht von in auf out).
Kann mir bitte jemand helfen?
ich kann ein seltsames Phänomen nicht selber lösen. Hinweise in den Foren habe ich dazu nicht gefunden.
Aufgabe: Je eine LED an Port3 und Port4. Eine Taste an Port0 wird abgefragt. Ohne Tastendruck leuchtet nur die eine LED (grün), solange die Taste gedrückt wird, leuchtet nur die andere - rLED. Assembler, AVRStudio, flashen über RS232 nach dem Lernpaket, s.u.
Die Funktion ist korrekt am Experimentierboard (siehe Schaltschema, aus Lernpaket µC, Kainka) solange es an der RS232 hängt. Nach dem Reset leuchtet codegerecht die gLED, durch Tastendruck wird auf die rLED umgeschaltet.
;================================================= ==================================
; Deklarationen für den Praeprozessor und Konstanten (s.auch oben Speicherbelegung)
#include "tn13def.inc"
#define a r16 ;Kurzbezeichung für Allzweckregister r16
;
#define taste0 0 ;Taste0 auf PB0
#define rLED 3 ;Rote LED (auf Port PB3)
#define gLED 4 ;Grüne LED (auf Port PB4)
;================================================= ==================================
.org 0x0000 ;Interrupt Definition / I Handler Tabelle
; Code Labels Comments
rjmp reset ;Reset Handl. power-on, brown-out, watchdog
;================================================= ==================================
; Hauptprogramm
;================================================= ==================================
;
reset: ;=== Generelle Initialisierung
rcall mc_init
;
hauptpr: ;=== Löse Aufgabe: Teste Port PB0 auf Tastendruck
h2:
sbis pinb,taste0 ;Wenn Pinb_0 (0..7) = 1, dann rLED/PB3 einschalten
rjmp grnan ; sonst schalte die gLED/PB4 ein
rotan:
sbi portb,rLED ;Rote LED/PB3 an
cbi portb,gLED ; gLED/PB4 aus
rjmp tastende
grnan:
cbi portb,rLED ;Rote LED/PB3 aus
sbi portb,gLED ; gLED/PB4 an
;
tastende:
rjmp h2
;
;================================================= ==================================
; Prozeduren
;================================================= ==================================
;
;================================================= ==================================
; Initialisierungen
;================================================= ==================================
;
mc_init: ;=== Initialisiere Mikrocontroller
;ALLE Register initialisieren hier := pull-ups einschalten
;
ldi a,0b00111000 ;Datenrichtung "Eingänge" für ports 0 - 2
out ddrb,a ; und "Ausgänge" für ports 3 - 5
;
ldi a,0b00111000
out portb,a ; ports aus-(=) oder ein(1)schalten; low = sink
ret ;=====----->>>>>
;
;================================================= ==================================
; Ende des Quellcodes
;================================================= ==================================
Wenn ich die Schaltung (also die Platine nur umstecke) an einem 9V-Block laufen lasse, leuchtet sofort die rLED auf und lässt sich nicht mehr ausknipsen. Dabei ist es egal, ob ich die 9V am Anschluss RTS einleite oder, wie im Buch zum Lernpaket angegeben an DTR.
Eine Kontrolle der Spannungen ohne Peripherie und µC an der Platine mit angeschlossenem 9V-Block gab keine unerlaubten Spannungen an den 8 Pins.
Das Problem ist eigentlich aufgetaucht bei einer interruptgesteuerten Tastenabfrage mit Signalausgabe an einem Piezo. Daher hatte ich den beschriebenen Versuchsaufbau erstellt.
Der entsprechende Passus im datasheet
ATtiny13 (179 pages, revision H, updated 10/07) auf
http://www.atmel.com/dyn/resources/prod_documents/doc2535.pdf
auf S 45, Abschnitt Switching Between Input and Output - oberhalb table 19 - ist mir schon so einigermassen klar - aber ich verstosse offenbar nicht dagegen (Port wird ja nur aus- und eingeschaltet - nicht von in auf out).
Kann mir bitte jemand helfen?