Morgen,
Wir sind gerade dabei eine Binäruhr mit dem ATMEGA8 zu realisieren. Wir
haben den Schaltplan und das Programm fertig geschrieben, unabhängig
voneinander funktioniert das ganze auch, jedoch wenn wir den ATMega8 in
die Schaltung einbinden, wird der ATMega8 warm und es passiert nichts.
Es wäre schön wenn sich einer dem Problem annehmen würde und uns helfen
würde.
Als Anhang der Schaltplan und quellcode
Mit freundlichen Grüßen
Xine
.include "m8def.inc"
//==========[ Register Definitions ]===============
.def akku = r16
.def Stunden = r17
.def Minuten = r18
.def Sekunden = r19
.def Kontrolle = r20
//==========[ Interrupt Vector Table ]===============
.org OVF0addr
rjmp timer0_int
.org OVF1addr
rjmp timer1_int
//==========[ Main Programm ]===============
.org 0x00
rjmp main
.org 0x40
//Stackpointer
main: ldi r16, LOW(RAMEND)
out SPL, r16
ldi r16, HIGH(RAMEND)
out SPH, r16
ldi r20, 0b00000001
ldi akku, 0b00111111
out PORTC, akku
ldi akku, 0b00011000
out DDRD, akku
rcall tim0_init
rcall tim1_init
main_loop: rcall show_time
rjmp main_loop
//==========[ Timer 0 ]===============
/*
Wird verwendet um die Taster abzufragen
*/
//-----------[ init ]-----------------
/*
Hier fehlt das setzen des Startwerts
*/
tim0_init:
// Startwert initialisieren
// Prescaler setzen
ldi r16, 0b00000101 ; Prescaler 1024
out TCCR0, r16
// Interrupt Maske setzen
ldi r16, 0b00000101 ; TOIE0: Interrupt bei Timer
Overflow
out TIMSK, r16
// Interrupts aktivieren
sei
ret
//-----------[ Overflow Ereignis]---------
/*
*/
timer0_int: rcall tim0_init
in r16, PIND
andi r16, 0b00011000
cpi r16, 0b00011000
breq next_c
cpi r20, 0b00000010
breq control_h
cpi r20, 0b00000100
breq control_m
cpi r20, 0b00001000
breq control_s
cpi r20, 0b00010000
breq leave_c
reti
// naechste Kontrolleinstellung aktivieren
next_c: lsl r20
reti
// kontrolle fuer Stunden
// abschalten des Sekundentimers
control_h: push r16
ldi r16, 0b00000000
out TCCR1B, r16
pop r16
sbrc r16,3
inc Stunden
sbrc r16,4
dec Stunden
reti
// kontrolle fuer Minuten
control_m: sbrc r16,3
inc Minuten
sbrc r16,4
dec Minuten
reti
// kontrolle fuer Sekunden
control_s: sbrc r16,3
inc Sekunden
sbrc r16,4
dec Sekunden
reti
// kontrollmodus verlassen
leave_c: ldi r20, 0x01
rcall tim1_init
reti
//==============[ Timer 1 ]==================
/* Wird verwendet um Sekundenereignis zu erzeugen */
tim1_init: // Startwert
ldi r16, 0xBE
out TCNT1L, r16
ldi r16, 0xF0
out TCNT1H, r16
// Prescaler setzen
ldi r16, 0b00000101
out TCCR1B, r16
// Interrupt Maske setzen
ldi r16, 0b00000101
out TIMSK, r16
sei
ret
timer1_int: rcall tim1_init
rcall zeitlauf
reti
//=====[ Zeitlauf ]======
/* Zaehlt die Zeitregister Stunden, Minuten und Sekunden hoch.
Benoetigt zum Durchlauf in jeder konstellation 13 Takte + 1 fuer Return
*/
;Takte
zeitlauf: inc Sekunden ;1 1 1 1
cpi Sekunden,60 ;1 1 1 1
brne zlsek ;1 2 1 1
inc Minuten ;1 1 1
ldi Sekunden,0 ;1 1 1
cpi Minuten,60 ;1 1 1
brne zlmin ;1 2 1
inc Stunden ;1 1
ldi Minuten,0 ;1 1
cpi Stunden,24 ;1 1
brne zlstd ;1 2
ldi Stunden,0 ;1
rjmp zlend ;1
;Summe 13 4 8 12
// 9 Wartetakte
zlsek: nop
nop
nop
nop
// 5 Wartetakte
zlmin: nop
nop
nop
nop
// 1 Wartetakt
zlstd: rjmp zlend
zlend: ret
//==============[ Zeitanzeige ]===================
show_time:
// Bit 0 fuer Sekunden freigeben
sbi PORTD,0
SBRC Sekunden,0
RJMP sek1
rcall warten
rs0: sbi PORTC, 0
SBRC Sekunden,1
RJMP sek2
rcall warten
rs1: sbi PORTC, 1
SBRC Sekunden,2
RJMP sek4
rcall warten
rs2: sbi PORTC, 2
SBRC Sekunden,3
RJMP sek8
rcall warten
rs3: sbi PORTC, 3
SBRC Sekunden,4
RJMP sek16
rcall warten
rs4: sbi PORTC, 4
SBRC Sekunden,5
rjmp sek32
rcall warten
rs5: sbi PORTC, 5
// Bit 0 fuer Sekunden sperren
cbi PORTD,0
// Bit 1 fuer Minuten freigeben
sbi PORTD,1
SBRC Minuten,0
RJMP min1
rcall warten
rm0: sbi PORTC, 0
SBRC Minuten,1
RJMP min2
rcall warten
rm1: sbi PORTC, 1
SBRC Minuten,2
RJMP min4
rcall warten
rm2: sbi PORTC, 2
SBRC Minuten,3
RJMP min8
rcall warten
rm3: sbi PORTC, 3
SBRC Minuten,4
RJMP min16
rcall warten
rm4: sbi PORTC, 4
SBRC Minuten,5
rjmp min32
rcall warten
rm5: sbi PORTC, 5
// Bit 1 fuer Minuten sperren
cbi PORTD,1
// Bit 2 fuer Stunden freigeben
sbi PORTD,2
SBRC Stunden,0
RJMP std1
rcall warten
rh0: sbi PORTC, 0
SBRC Stunden,1
RJMP std2
rcall warten
rh1: sbi PORTC, 1
SBRC Stunden,2
RJMP std4
rcall warten
rh2: sbi PORTC, 2
SBRC Stunden,3
RJMP std8
rcall warten
rh3: sbi PORTC, 3
SBRC Stunden,4
RJMP std16
rcall warten
rh4: sbi PORTC, 0
// Bit 2 fuer Stunden sperren
cbi PORTD,2
ret
sek1: cbi PORTC, 0
rcall leuchten
rjmp rm0
sek2: cbi PORTC, 1
rcall leuchten
rjmp rm1
sek4: cbi PORTC, 2
rcall leuchten
rjmp rm2
sek8: cbi PORTC, 3
rcall leuchten
rjmp rm3
sek16: cbi PORTC, 4
rcall leuchten
rjmp rm4
sek32: cbi PORTC, 5
rcall leuchten
rjmp rm5
min1: cbi PORTC, 0
rcall leuchten
rjmp rm0
min2: cbi PORTC, 1
rcall leuchten
rjmp rm1
min4: cbi PORTC, 2
rcall leuchten
rjmp rm2
min8: cbi PORTC, 3
rcall leuchten
rjmp rm3
min16: cbi PORTC, 4
rcall leuchten
rjmp rm4
min32: cbi PORTC, 5
rcall leuchten
rjmp rm5
std1: cbi PORTC, 0
rcall leuchten
rjmp rh0
std2: cbi PORTC, 1
rcall leuchten
rjmp rh1
std4: cbi PORTC, 2
rcall leuchten
rjmp rh2
std8: cbi PORTC, 3
rcall leuchten
rjmp rh3
std16: cbi PORTC, 4
rcall leuchten
rjmp rh4
leuchten: nop
nop
nop
ret
warten: nop
ret
Wie groß sind denn die Widerstände? S2/S3 sollten nach GND schließen, nicht nach +5V. Zweiten Oszillatorpin besser unbeschaltet lassen (PB7). Unbenutzte Portleitungen dürfen nur mit GND verbunden werden, wenn sie nie versehentlich als Ausgang konfoguriert und auf High geschaltet werden können. Sicherer ist es, sie offen zu lassen und als Eingänge mit Pull-Up zu definieren (DDRx=0, PORTx=1).
Genauso AREF. Wenn du an AREF nichts anschliest, dann lass ihn offen. Der Reset Taster ist wirkungslos. Bei AVR ist Reset standardmässig high und ein Low-Pegel löst einen Reset aus. (Habt ihr euch keine anderen Schaltungen angesehen, ehe ihr das Ding gebaut habt?)
Also 6 LEDs an einen PIN, dann sollten das schon Low Current sein. Ich würde vor die Spalten noch Transistoren schalten.
Nebenbei gibt es beim Mega 8/16/32 keinen analog GND (AGND) sondern nur GND! Holt euch mal bei Cadsoft die neueste Atmel.lbr
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
