mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik binäruhr - verliert zeit [code]


Autor: S. S. (-xc-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi

zu übungszwecken will ich 6 LEDs ansteuern die im sekunden takt 
hochzählen und bei 60 wieder auf null springen..
funktioniert soweit eigentlich auch ganz gut...nur verliert meine Uhr 
zeit...

meine vermutung:
entweder habe ich mich mit der quarzfrequenz und dem hochzählen vertan 
so das er minimal zulangsam hochzählt

oder

der code selbst verbraucht irgendwie zeit sodas sie langsamer 
läuft..wobei das ja eigentlich nicht sein kann da das ganze über 
interrupt und counter läuft...

quarzfrequenz : 16MHZ
uC            : Atmega8


mein gedanke dahinter:

zähler läuft mit 16MHZ/1024(prescaler) = 15625HZ
zählt also pro sekunde bis 15625
interrupt wird alle 255 ausgelöst.
da der zähler 0,01632 sek braucht um bis 255 zu zählen addiere ich
pro interupt 1632 auf meinen zähler der bei 100.000 voll ist und die 
sekunde inkrementiert.
anschließend subtrahiere ich vom zähler wieder 100.000 und es geht von 
vorne los der überschuss bleibt also drin.


achja noch was anderes
wenn ich meine 6 leds an die pins pd0 bis pd5 hänge schaltet eine nicht 
richtig...sie leuchtet zwar aber nur gaaaanz schwach...gleiches hatte 
ich auch als ich die komplette schaltung auf die PCx ports umgebaut 
hatte.
ich habe es auch an einem weiteren atmega8 probiert > gleiches ergebnis

deshalt habe ich die 5te stelle auf den PD6 pin gelegt da gehts 
:confused:
macht dummerweise nur mehr arbeit da man nicht mehr einfach PORTD = sek 
sagen kann...


gruß

edit:
mit zeitverlieren meine ich so zirka: 1sek/min
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
 

volatile int  sek, min;
volatile int32_t zahler;
main()
{
 
 

   //Timer 0 konfigurieren
     DDRD  = 0b01101111;          //definiert portC ping 0-3 als ausgang
     
  PORTD = 0b01101111;          //setzt die ausgänge 0-3 vom port C auf logisch 0
     TCCR0 = (1<<CS00) | (1<<CS02);   //1024er prescaler
  min=0;
  sek=0;
int test;
  test=0;
 

   TIMSK|=(1<<TOIE0);        //timer overflow interrupt
   //Globale Interrupts aktivieren
   sei();
   
   while(1)
     {

test=sek;
if(test & 0b00010000) {test |= 0b01000000;}

    PORTD = test;

  }

}
 
 
ISR(TIMER0_OVF_vect)
{
  zahler +=1632;
if(sek ==60)       {min++; sek=0;}
  if(zahler >=100000)   {sek++; zahler -= 100000;}

}


Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch's mal mit nem 16-Bit-Timer und nem Compare Match, dann hast Du 
eine exakte Sekunde ohne solche Verrenkungen.

Autor: Gast4 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: S. S. (-xc-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke ich denke der link bringt mich weiter.

Autor: S. S. (-xc-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann sich denn keiner einen reim draus machen, warum einer der pins 
keine leistung bringt?
wie gesagt, aus PD4 kommt keine leistung (bei zwei uCs getestet)
gleiches hatte ihc auch an den PC ports einer ging nicht richtig

es kam was aber nur so das die led ganz schwach geleuchtet hat. es war 
so grade von aus zuunterscheiden

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
S. S. schrieb:

> wie gesagt, aus PD4 kommt keine leistung (bei zwei uCs getestet)
> gleiches hatte ihc auch an den PC ports einer ging nicht richtig

DDRD  = 0b01101111;

Wie soll da auch "Leistung rauskommen", wenn es ein Eingang ist?

Autor: S. S. (-xc-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das habe ich erst nachträglich geändert. der ordnung halber ;)
als es noch ein ausgang war, kam ja was raus nur seeeehr wenig

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>wie gesagt, aus PD4 kommt keine leistung (bei zwei uCs getestet)

> DDRD  = 0b01101111;          //definiert portC ping 0-3 als ausgang

Wenn die zweite Zeile dein gültiger Code ist, hast du PD4 als Eingang 
konfiguriert.

MfG Spess

Autor: S. S. (-xc-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein ist nicht der code mit dem ich das problem hatte!ich habe ja extra 
die eine led auf den anderen port gelegt um das problem zu umgehen.#

im original code war der eine port um den es geht als ausgang definiert. 
ich habe es auch noch an den PCx ports probiert > gleiches problem (ein 
port wollte nicht richtig)
und dann noch an einem ganz zweiten atmega8 iC

an der programmierung lag des definitiv nicht, da die led ja geleuchtet 
hat als sie es sollte nur eben vieeeeel zu dunkel (an der led und dem 
vorwiderstand lag es nicht!)
betreibe jetzt die gleiche konfiguration nur an einem anderen pin und es 
geht

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>hat wann sie es sollte nur eben vieeeeel zu dunkel (an der led und dem
>vorwiderstand lag es nicht!)

Das kann eine LED unter Umständen auch an einem Eingang. Mit dem Setzen 
des Portpins wird der interne PullUp-Widerstand eingeschaltet. Bei einer 
Low-Current-LED kann da durchaus ein 'Glimmen' zu sehen sein.

MfG Spess

Autor: S. S. (-xc-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok ich gucke nochmal bin mir aber zu 99.9% sicher das das nicht der 
fehler ist.

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.