-
        

Ergebnis 1 bis 6 von 6

Thema: Digitaluhr mit Atmega8 und externem 32768Hz Takt

  1. #1

    Digitaluhr mit Atmega8 und externem 32768Hz Takt

    Anzeige

    Hallo,

    ich bin gerade dabei eine Digitaluhr mit Hilfe eines Atmega8 und einem externem 32768Hz Takt zu entwickeln, die Hardware ist schon ferig!!! Sie ist mit 4 Siebensegmentanzeigen ausgestattet und 4 Tastern.
    die Hardware ist auch 100% funktionstüchtig.

    Soweit so gut,jetzt zu meinem Problem:

    Ich soll(muss) dazu ein Programm im AVR Studio entwickeln. Mein Problem dabei ist: Wie bekomme ich den Sekunden Takt zustande????

    Wäre toll,wen mir jemand dabei helfen könnte!!!

    Danke schon im voraus!!!

    MiniMan

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Den Timer 2 kann man mi asynchronen Mode betreiben und extern durch die 32768 Hz takten lassen.

    Die 32kHz als Systemtakt zu verwenden ist nicht so sinnig, weil die Anzeige bestimmt geMUXt wird...

    Beschreibung für Timer2 findest du im Handbuch und es wird besprochen (allerdings in C)

    http://www.roboternetz.de/phpBB2/zei...ag.php?t=28820

    Was die internen Kondensatoren angeht gibt's AKAIK ein Erratum, so daß du evtl. externe nehmen musst.
    Disclaimer: none. Sue me.

  3. #3
    Danke erstma für deine Antwort!

    Ich muss das aber in Assembler programmieren und nicht mit Borland Builder...

    ja ich muss das auch mit dem timer 2 machen... kann mir jemand ein stück quelltext geben für die sekundenerzeugung???

    Code:
    .def temp1=r16
    .def temp2=r17
    .def Sekunden=r18
    .def Minuten=r19
    .def Stunden=r20
    
    		rjmp	Start		;Sprung zum Programmanfang
    		reti				;Interruptvektortabelle 
    		reti
    		rjmp	timer2_overflow		;Timer Overflow Handler
    		reti		
    		reti
    		reti		
    		reti
    		reti		
    		reti
    		reti
    		reti
    		reti		
    		reti
    		reti		
    		reti
    		reti		
    		reti
    		reti
    Setup:	
    	ldi	temp1, 0b00011110
    	out DDRC, temp1
    	ldi temp1, 0b01111111
    	out DDRD, temp1
    	in  temp1,ASSR
    	ori temp1,0b00001000
    	out ASSR,temp1
    	ret
    
    Start:	
    
    		ldi	temp1, LOW(RAMEND)
    		out SPL, temp1
    		ldi	temp1, HIGH(RAMEND)
    		out SPH, temp1
    
    		rcall Setup
    
    		ldi temp1,0b00000101  ;(32768/128)/256=1  Vorteiler
    		out TCCR2,temp1
    		
    		ldi temp1,0b01000000
    		out TIMSK,temp1
    		
    		sei 	
    
    LOOP:  
    
    timer2_overflow:  
    
    		push temp2
    		inc	Sekunden
    		cpi Sekunden,60
    		
    		
    
    		brne Ausgabe
    		clr Sekunden
    		
    		inc Minuten
    		cpi Minuten,60
    		brne Ausgabe
    		clr Minuten
    
    		inc Stunden
    		cpi Stunden,24
    		brne Ausgabe
    		clr Stunden
    Ausgabe: 
    		;ldi temp1, 0b11111111
    		;out portd, temp1
         	;com temp1
         	;reti
    		mov temp2,Sekunden
    		lsr temp2
    		brcs AZE
    		rcall a
    		rcall A4
    		  
    		rjmp end_isr
    AZE: 	rcall a
    		rcall A3
    		
    
    		end_isr:
    		pop temp2
    		reti 
    rjmp LOOP
    
    a:	ldi	temp1, 0b10000001 	;Zeige Ziffer 0 
    	out PortD, temp1
    	ret
    
    b:	ldi	temp1, 0b11001111 	;Zeige Ziffer 1 
    	out PortD, temp1
    	ret
    
    c:	ldi	temp1, 0b10010010 	;Zeige Ziffer 2 
    	out PortD, temp1
    	ret
    
    d:	ldi	temp1, 0b10000110 	;Zeige Ziffer 3 
    	out PortD, temp1
    	ret
    
    e:	ldi	temp1, 0b11001100 	;Zeige Ziffer 4 
    	out PortD, temp1
    	ret
    
    f:	ldi	temp1, 0b11000100 	;Zeige Ziffer 5 
    	out PortD, temp1
    	ret
    
    g:	ldi	temp1, 0b11000000 	;Zeige Ziffer 6 
    	out PortD, temp1
    	ret
    
    h:	ldi	temp1, 0b10001111 	;Zeige Ziffer 7 
    	out PortD, temp1
    	ret
    
    i:	ldi	temp1, 0b10000000 	;Zeige Ziffer 8 
    	out PortD, temp1
    	ret
    
    j:	ldi	temp1, 0b10000100 	;Zeige Ziffer 9 
    	out PortD, temp1
    	ret
    		
    A1:	ldi temp1, 0b00000010	;Anzeige 1 an
    	out PortC, temp1
    	ret
    
    A2:	ldi temp1, 0b00000100	;Anzeige 2 an
    	out PortC, temp1
    	ret
    
    A3:	ldi temp1, 0b00001000	;Anzeige 3 an
    	out PortC, temp1
    	ret
    
    A4:	ldi temp1, 0b00010000	;Anzeige 4 an
    	out PortC, temp1
    	ret
    
    delete1:	
    	ldi temp1, 0b11111111	;Segmente loeschen
    	out PortD, temp1
    	ret
    delete2:	
    	ldi temp1, 0b00000000	;Anzeige loeschen
    	out PortC, temp1
    	ret
    
    .include 	"m8def.inc"
    soweit bin ich jetzt.... was is falsch oder fehlt noch?????

    wär echt ned,wenn mir jemand helfen kann...

    THX

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Ich hab da ein paar unschönheiten und Fehler in deinem Code entdeckt und diesen berichtigt.

    Die Main Routine läuft in den Interrupt, das kann so nicht sein.
    Der Interrupt Vektor für den Timer Overflow ist an der falschen Stelle.
    Im Interrupt wurde das SREG nicht gesichert.

    So wie ich das sehe muss den Controller auf internen Oszillator gefused sein, oder er läuft auch mit 32kHz.

    Simulieren ist hierbei etwas schwierig, du könntest für den Simulator eine Taktfrequenz von 32768 einstellen und lässt den Timer auf der Prozessortaktquelle laufen. Nur für den Simulator natürlich.

    Code:
    .include    "m8def.inc"
    
    .def temp1=r16
    .def temp2=r17
    .def Sekunden=r18
    .def Minuten=r19
    .def Stunden=r20
    
     .cseg
     .org 0
          rjmp   Start      ;Sprung zum Programmanfang
          reti            ;Interruptvektortabelle
          reti
          reti
    	  rjmp   timer2_overflow      ;Timer Overflow Handler
          reti
          reti      
          reti
          reti      
          reti
          reti
          reti
          reti      
          reti
          reti      
          reti
          reti      
          reti
          reti
    
    
    Start:   
          ldi   temp1, LOW(RAMEND)
          out SPL, temp1
          ldi   temp1, HIGH(RAMEND)
          out SPH, temp1
    	  clr Sekunden ; Könnten ja Werte >60 drinstehen
    	  clr Minuten
    	  clr Stunden	
          
    
    rcall Setup
    
          ldi temp1,0b00000101  ;(32768/128)/256=1  Vorteiler
          out TCCR2,temp1
          
          ldi temp1,0b01000000
          out TIMSK,temp1
          
          sei    
    
    LOOP:rjmp LOOP 
    
    
    
    Setup:   
       ldi   temp1, 0b00011110
       out DDRC, temp1
       ldi temp1, 0b01111111
       out DDRD, temp1
       in  temp1,ASSR
       ori temp1,0b00001000
       out ASSR,temp1
       ret
    
    
    
    timer2_overflow: 
    
          push temp2
          in temp2,SREG
    	  push temp2
    	  inc   Sekunden
          cpi Sekunden,60
          
          
    
          brne Ausgabe
          clr Sekunden
          
          inc Minuten
          cpi Minuten,60
          brne Ausgabe
          clr Minuten
    
          inc Stunden
          cpi Stunden,24
          brne Ausgabe
          clr Stunden
    Ausgabe:
          ;ldi temp1, 0b11111111
          ;out portd, temp1
            ;com temp1
            ;reti
          mov temp2,Sekunden
          lsr temp2
          brcs AZE
          rcall a
          rcall A4
           
          rjmp end_isr
    AZE:    rcall a
          rcall A3
          
    
          end_isr:
          pop temp2
    	  out SREG,temp2
    	  pop temp2
          reti
    
    
    a:   ldi   temp1, 0b10000001    ;Zeige Ziffer 0
       out PortD, temp1
       ret
    
    b:   ldi   temp1, 0b11001111    ;Zeige Ziffer 1
       out PortD, temp1
       ret
    
    c:   ldi   temp1, 0b10010010    ;Zeige Ziffer 2
       out PortD, temp1
       ret
    
    d:   ldi   temp1, 0b10000110    ;Zeige Ziffer 3
       out PortD, temp1
       ret
    
    e:   ldi   temp1, 0b11001100    ;Zeige Ziffer 4
       out PortD, temp1
       ret
    
    f:   ldi   temp1, 0b11000100    ;Zeige Ziffer 5
       out PortD, temp1
       ret
    
    g:   ldi   temp1, 0b11000000    ;Zeige Ziffer 6
       out PortD, temp1
       ret
    
    h:   ldi   temp1, 0b10001111    ;Zeige Ziffer 7
       out PortD, temp1
       ret
    
    i:   ldi   temp1, 0b10000000    ;Zeige Ziffer 8
       out PortD, temp1
       ret
    
    j:   ldi   temp1, 0b10000100    ;Zeige Ziffer 9
       out PortD, temp1
       ret
          
    A1:   ldi temp1, 0b00000010   ;Anzeige 1 an
       out PortC, temp1
       ret
    
    A2:   ldi temp1, 0b00000100   ;Anzeige 2 an
       out PortC, temp1
       ret
    
    A3:   ldi temp1, 0b00001000   ;Anzeige 3 an
       out PortC, temp1
       ret
    
    A4:   ldi temp1, 0b00010000   ;Anzeige 4 an
       out PortC, temp1
       ret
    
    delete1:   
       ldi temp1, 0b11111111   ;Segmente loeschen
       out PortD, temp1
       ret
    delete2:   
       ldi temp1, 0b00000000   ;Anzeige loeschen
       out PortC, temp1
       ret

  5. #5
    danke erstmal für deine Hilfe!!!

    kann mir jemand noch weiter helfen und mir den quellcode schreiben bzw. geben. am besten nicht nur für den sekunden takt, sondern gleich den quellcode,welcher eine minute oder mehr zählen kann???? das wär echt super nett!!!! DANKE!!!

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    am besten nicht nur für den sekunden takt, sondern gleich den quellcode,welcher eine minute oder mehr zählen kann????
    Ähhh, das versteh ich jetzt nicht ?
    Die überläufe für Sekunden und Minuten sind doch in deinem Code schon enthalten.
    Wenn Du die Sekunden nicht anzeigst, sonder nur weiterzählst hast Du doch genau den Effekt.
    Wenn du den Code erweiterst kannst Du auch Tage, Wochen und Monate anzeigen, wenn Du lustig bist.
    Das man jemandem bei einem Problem hilft, dafür ist ein Forum da.
    Das ein Anderer einem seine Hausaufgaben macht ist meiner Meinung nach nicht Sinn der Sache. Du sollst ja auch was dabei lernen !

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •