Hallo,
ich bin grade an meinem avr Digitale Uhr Projekt
und habe einige Fragen zu avr C.
Im Anhang der komplette Code fuer meine Uhr zur Zeit.
Es ist eine Uhr mit 2mhz Quarz und 6 7-Segment LEDs mit gemeinsamer
Anode zur Anzeige. Die Segmente der 7Seganzeige sind jeweils parallel
verbunden und mit 7 Transistoren nach GND verbunden. Jedes
Segment hat quasi seinen eigenen Transistor und die werden durch
die einzelnen uC Pins gesteuert.
Die Anzeigetechnik ist Multiplexing, der uC ist ein Attiny2313.
Ich hab 2 konkrete Fragen zum avr-C, folgende Situation:
1) Ich wollte Taster per Interrupt einsetzen. Dazu
hab ich die GIMSK |= (1<<PCIE); PCMSK |= (1<<PCINT7) | (1<< PCINT6);
gesetzt, ebenfalls wurde sei() ausgefuehrt.
Sobald diese Register gesetzt waren, war aber ploetzlich
jedes Mal beim Betaetigen der Taster eine Resetwirkung des Controllers
festzustellen. Die Uhranzeige hat sich immer wieder reseted.
Dann hab ich die Loesung ohne Interrupts wie im Anhang verwendet
mit der direkten PIN abfrage.
2) Ich wollte die 7Segmentanzeige an und ausmachen wollen per Taster.
Also hab ich in meiner Pinabfrage folgenden Code ausprobiert,
hier mal als Ausschnitt ausm Kopf zusammengereimt:
1 | int an = 1;
|
2 | int trust = 0;
|
3 | while(1){
|
4 | if(!(PIN & (1<<6)){
|
5 | trust++;
|
6 | if(trust >= 100){
|
7 | if(an == 1) an = 0;
|
8 | else if(an == 0) an = 1;
|
9 | trust = 0;
|
10 | }
|
11 | // wenn der else if teil wegfaellt, dann funktionierts,
|
12 | // allerdings geht das Display dann nur aus
|
13 | // alternativ probierte ich erst an ^= 1;
|
14 |
|
15 | }
|
16 |
|
17 | if(an == 1) {
|
18 | //Code fuer Displayanzeige
|
19 | }
|
20 | }
|
Sobald ich das "an und aus Spiel" auf 2 Taster verteilt habe,
hats auch funktioniert. Nur mit einem Taster gings nicht.
Ich habs anders geloest in der jetzigen Version, aber es scheint
mir ziemlich beknackt zu sein und ich verstehe nicht, warum
es nicht funktioniert. Ich vermute es liegt an der Compileroptimierung.
Ohne Optimierung gehts aber nicht, Code zu gross um es auf den
uC zu laden.
3[die unkonkrete Frage]) Der Code im Anhang funktioniert auf jeden Fall
schonmal grob.
Die Uhr laeuft und ich kann auch die Uhrzeit einstellen.
Womit ich allerdings Probleme hab ist, dass die Uhr abstuerzt,
wenn ich die Taster intensiv benutze. Wenn ich zu intensiv
die Uhrzeit einstelle, dann passiert es, dass ploetzlich
das 7Segmentdisplay nur noch eine 1 anzeigt und nur noch ein
Reset weiterhilft. Ebenso verstellt sich manchmal die Zeit,
wenn ich das Display an und ausschalte, obwohl der Taster
nichts mit der Zeiteinstellung zu tun haben sollte.
Das ist Verhalten, was ich nicht verstehe... ich fuerchte,
dass da elektronikmaessig Stoerungen sind, die ich nicht begreife.
Man muss dazu sagen, dass 82mA Strom fliessen wenns Display an
ist und 1,3mA wenns aus ist. Das sind immer ziemliche Spruenge
mit dem an und aus machen. Kann es damit zusammmenhaengen?
lg Antoni