mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA8 Binäruhr Problem


Autor: xine (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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).

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Pins 11-19 müssen die wirklich auf Masse !

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm AVCC mal von Masse weg und schließ Vcc dort an.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?)

Autor: stepp64 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also 6 LEDs an einen PIN, dann sollten das schon Low Current sein. Ich 
würde vor die Spalten noch Transistoren schalten.

Autor: Jörn Paschedag (jonnyp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nebenbei gibt es beim Mega 8/16/32 keinen analog GND (AGND) sondern nur 
GND!
Holt euch mal bei Cadsoft die neueste Atmel.lbr

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.