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


von S. S. (-xc-)


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
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/delay.h>
4
 
5
6
volatile int  sek, min;
7
volatile int32_t zahler;
8
main()
9
{
10
 
11
 
12
13
   //Timer 0 konfigurieren
14
     DDRD  = 0b01101111;          //definiert portC ping 0-3 als ausgang
15
     
16
  PORTD = 0b01101111;          //setzt die ausgänge 0-3 vom port C auf logisch 0
17
     TCCR0 = (1<<CS00) | (1<<CS02);   //1024er prescaler
18
  min=0;
19
  sek=0;
20
int test;
21
  test=0;
22
 
23
24
   TIMSK|=(1<<TOIE0);        //timer overflow interrupt
25
   //Globale Interrupts aktivieren
26
   sei();
27
   
28
   while(1)
29
     {
30
31
test=sek;
32
if(test & 0b00010000) {test |= 0b01000000;}
33
34
    PORTD = test;
35
36
  }
37
38
}
39
 
40
 
41
ISR(TIMER0_OVF_vect)
42
{
43
  zahler +=1632;
44
if(sek ==60)       {min++; sek=0;}
45
  if(zahler >=100000)   {sek++; zahler -= 100000;}
46
47
}

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

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

von Gast4 (Gast)


Lesenswert?


von S. S. (-xc-)


Lesenswert?

danke ich denke der link bringt mich weiter.

von S. S. (-xc-)


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

von Stefan E. (sternst)


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

1
DDRD  = 0b01101111;

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

von S. S. (-xc-)


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

von spess53 (Gast)


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

von S. S. (-xc-)


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

von spess53 (Gast)


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

von S. S. (-xc-)


Lesenswert?

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

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
Noch kein Account? Hier anmelden.