PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eieruhr



crabtack
05.07.2010, 15:33
Hallo,
Das ist mein erstes µC projekt nach einem Lauflicht.
Oben im bild sind led´s die eine Minute darstellen und unten led´s die 10 minuten darstellen.
Im bild sind es gerade 16 minuten.Untwen sit auch eine an, die kann man schlecht erkennen.
Mit den beiden Minuten kann man die Zeit eine Minute hoch oder runter setzen.
Der Taster in der Mitte macht, dass die eieruhr anhält runterzu zählen bzw. weiterzählt.
Es wird von der Led an der das II zeichen ist angezeigt.
Insgesammt kann die Eieruhr 69 Minuten Anzeigen.

Ich danke vor allem Thomas, der mir sehr geholfen hat auber auch vielen anderen.

Jetzt habe ich noch eine Frage:
Im moment läuft der Atmega32 noch ohne quarz.
Wie kann ich einstellen, dass der atmega einen externen quarz nutzt?
Muss der quarz eigentlich kondensatoren zu masse haben?

TobiKa
05.07.2010, 15:54
Wie kann ich einstellen, dass der atmega einen externen quarz nutzt?
Per FuseBits.


Muss der quarz eigentlich kondensatoren zu masse haben?
Wenn du das selbe meinst die ich, muss nciht aber ist besser!

Kampi
05.07.2010, 16:15
Wäre gut zu wissen wie du den Controller programmierst....dann kann man dir das bischen genauer erklären, weil je nach Programm was du benutzt macht man das anders.

Und der Kondensator für das Quarz ist mein ich dafür da damit das Quarz stabiler schwingt, also wäre es gut wenn du da zwei dran machst. An jeden Pin vom Quarz ein Kondensator und den anderen Pin an Masse legen. Bei 16MHz müssen die Kondensatoren mein ich 18pF groß sein.

crabtack
05.07.2010, 17:38
Momentan habe ich leider keine keramikkondensatoren.

#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>
#include <stdint.h>


int main(void)
{
int time = 0;
int second = 0;
int time_e = 0;
int time_z = 0;
int tast = 0;



DDRB = 255;
DDRA = 225;
DDRD = 0;
PORTD = 255;
DDRC = 225;
while(1)
{

if (PIND == (PIND & 0b11101111))
{
if (tast == 0)
{
tast = 1;
PORTC = 0b00000001;
}
else
{
tast = 0;
PORTC = 0b00000000;
}
}
if (tast == 0)
{
second = 0;
}


if (PIND == (PIND & 0b10111111))// 5 ist taster links
{
time--;
}

if (PIND == (PIND & 0b11011111))// hier ist das problem
{
time++;
}


time_z =(time/10);
time_e = time - (time_z*10);


if (time_z == 6)
{

PORTA = 0b00111111;

}
if (time_z == 5)
{
PORTA = 0b00011111;
}
if (time_z == 4)
{
PORTA = 0b00001111;
}
if (time_z == 3)
{
PORTA = 0b00000111;
}
if (time_z == 2)
{
PORTA = 0b00000011;
}
if (time_z == 1)
{
PORTA = 0b00000001;
}
if (time_z == 0)
{
PORTA = 0b00000000;
}
if (time_e==9)
{
PORTA = PORTA + 0b01000000;
PORTB = 0b11111111;
}
else if (time_e==8)
{
PORTB = 0b11111111;
}
else if (time_e==7)
{
PORTB = 0b01111111;
}
else if (time_e==6)
{
PORTB = 0b00111111;
}
else if (time_e==5)
{
PORTB = 0b00011111;
}
else if (time_e==4)
{
PORTB = 0b00001111;
}
else if (time_e==3)
{
PORTB = 0b00000111;
}
else if (time_e==2)
{
PORTB = 0b00000011;
}
else if (time_e==1)
{
PORTB = 0b00000001;
}
else if (time_e==0)
{
PORTB = 0b00000000;
}

_delay_ms(200);
second ++;
if (second == 300)
{
time --;
second = 0;
}


}
}


Mein wunderschönes Programm.
Wie genau macht man da smit den fuse bits? Ich benutze avr studio.

Kampi
05.07.2010, 18:07
Wenn du den Controller flashen willst, klickst du ja auf das schwarze IC wo "AVR" draufsteht. Dann öffnet sich ein Fenster und in diesem Fenster klickst du auf "Fuses".
So und da gehst du auf SUT_CHSEL und wenn du jetzt ein Quarz mit mehr als 10MHz (bei dem Wert bin ich mir nicht sicher!) stellst du das auf "Ext. Crystal/Resonator High Freq.; Start-up Time 16K: CK +64ms". Wenn dein Quarz unter 10MHz ist stellste das Bit auf Medium bzw Low Freq.
Bei den setzen der Fuses aber ganz vorsichtig sein und KEINE Fuses setzen von denen du nicht weißt was die machen. Weil dadurch kannste dir den ISP abschalten und dann geht nur noch JTAG.
Und falls du den falschen Clock gesetzt haben solltest einfach mit einem Frequenzgenerator oder einer anderen Taktquelle ein Quarz "simulieren"

Andree-HB
05.07.2010, 18:16
http://lmgtfy.com/?q=fusebits+avr+studio

crabtack
05.07.2010, 18:37
Wieso sollte ich noch googlen, wenn kampi es mir schon erklärt hat?
Danke.

Andree-HB
05.07.2010, 19:22
...genau, warum solltest Du etwas selbst tun, wenn Andere es schon für Dich getan haben ?

Ein leider sehr verbreitetes Mentalitätsproblem von einigen Usern in diesem Forum !

crabtack
05.07.2010, 19:36
Also wenn du der 1. wärst, der mit google geantwortet hätte hätte ich natürlich gegooglet.
Aber bei so speziellen sachen ist es sowieso schwer eine antwort zu finden.

Jaecko
05.07.2010, 22:13
Aber bei so speziellen sachen ist es sowieso schwer eine antwort zu finden.

Einspruch.
Eine Suche nach "avr controller externer quarz" bringt bei Google als 2. Ergebnis eine detaillierte Seite zu den Fuses.
Einfach mal mehrere Worte/Begriffe in Google ausprobieren; nicht nach dem 1. Versuch (soferns denn überhaupt einen gab) aufhören.

crabtack
06.07.2010, 09:12
Ok, dann werde ich in zukunft erst google bemühen.

crabtack
06.07.2010, 17:18
So, der Qaurz funktioniert.
Jetzt ist sie in einer stunde nur noch 10 sekunden zu langsam, das reicht ja für eine eieruhr.

Kampi
06.07.2010, 17:29
Du könntest das Quarz auch auswechseln und ein Uhrenquarz als Taktgeber verwenden. Wenn du Bascom benutzt gibt es da sogar eine Uhrfunktion die bereits implementiert ist, soweit ich recht gesehen habe.

Richard
06.07.2010, 18:28
Wäre gut zu wissen wie du den Controller programmierst....dann kann man dir das bischen genauer erklären, weil je nach Programm was du benutzt macht man das anders.

Und der Kondensator für das Quarz ist mein ich dafür da damit das Quarz stabiler schwingt, also wäre es gut wenn du da zwei dran machst. An jeden Pin vom Quarz ein Kondensator und den anderen Pin an Masse legen. Bei 16MHz müssen die Kondensatoren mein ich 18pF groß sein.

Der Kondensator ist eher dafür da das der Quarz überhaupt (anschwingt)
Wenn er Arbeitet wird der Kondensator (eigentlich) nicht wirklich benötigt.
Mit einem Trimmkondensator kan man allerdings die Frequenz (ein wenig)
ändern, das wird (wurde (?))gerne bei Uhren Quarzen zum feintunig
eingesetzt. Noch genauer sind "Quarzöfen", dort wird der Quarz extern
sehr genau beheizt.

Ach ja, ob 15 Oft liest man auch 22 nF....Die Schwingfrequenz wird sich
(leicht) ändern, Schwigkreis halt.

Gruß Richard

Kampi
06.07.2010, 19:08
Ahh danke für die verbesserung O:)

crabtack
07.07.2010, 13:51
Aslo bwei mir arbeitet er ohne kondensator.

Jaecko
07.07.2010, 14:04
Ist aber dann wohl nur Zufall. Probier mal aus, was der Controller machst, wenn du das Gehäuse des Quarzes berührst. Dann dürfte ziemlich schnell Feierabend sein.

SprinterSB
08.07.2010, 00:04
So, der Qaurz funktioniert.
Jetzt ist sie in einer stunde nur noch 10 sekunden zu langsam, das reicht ja für eine eieruhr.
Das Problem ist nicht ein "schlechter" Quarz, sondern die ungenaue Umsetzung der Zeitbasis in Sotware: Mit Warteschleife.

Du nimmst besser einen Timer im CTC-Modus. Damit ist deine Uhr genause exakt wie der Quarz, und das sind bestimmt keine 10s/h, also run 2700ppm Abweichung. Der Quarz ist bestimmt nicht schlechter als 10ppm, also als ca. 1s pro Tag.

crabtack
08.07.2010, 13:56
Das problem sind dabei m eine c++ kentnisse, mit timern will ich erstmal nichts zu tun ahben.

Was passiert denn wenn ich den quarz berühre?