Forum: Mikrocontroller und Digitale Elektronik Probleme mit einem kleinen Source auf einem ATMega8


von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Guten Morgen,

leider habe ich ein kleines Problem mit einem kleinen Source den ich 
letztens gebastelt habe.

Zu der Ausgangslage mal noch kurz ein paar worte. Ich arbeite mit einem 
AtMega8, an dem ADC0 sind 3 Schalter mit verschiedenen Vorwiderständen.
An PB6,PB2,PB1,PB0 Hängt ein Relaistreiber mit 4 Printrelais.

Die Hardware funktioniert soweit einwandfrei. Nur der Source ist 
irgendwie nicht ok. Es passiert einfach nichts. Bei dem Tastersource 
habe ich mit an dem Beispiel von RN orientiert.

Weis zufällig jemand was der Fehler sein könnte ??

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

hier noch die taster.c

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

und die Taster.h

von johnny.m (Gast)


Lesenswert?

> PORTB = (1 << PINB0);          // PB0 amschalten
Was soll das sein, "amschalten"? Umschalten oder aNschalten? Umschalten 
tut man mit einem Exklusiv-Oder, also "PORTB ^= (1 << PINB0)". "PORTB = 
(1 << PINB0)" schaltet nur ein (setzt den Portpin auf logisch 1).

Ansonsten wäre eine kleine Beschreibung hilfreich, die besagt, was genau 
der Code denn machen soll, wenn er funktioniert.

Abgesehen davon scheinst Du den Code Generation Wizard von CodeVision 
verwendet zu haben. Ich hoffe, Du hast bedacht, dass der von CVAVR 
generierte Code nur bedingt AVR-GCC-kompatibel ist (ich habe jetzt keine 
Zeit, den kompletten Code daraufhin durchzugehen...).

Eine andere Sache ist, dass Du SIGNAL verwendest. SIGNAL wird zwar von 
der aktuellen WINAVR-Version noch unterstützt, allerdings sollte man in 
Hinblick auf "future compatibility" das Schlüsselwort ISR verwenden.

von johnny.m (Gast)


Lesenswert?

> #if TASTER_LEVEL
>     tast = !!tast;
> #else
>     tast = !tast;
> #endif

Ich hoffe übrigens auch, dass Du Dir im Klaren darüber bist, was der 
"!"-Operator macht. Ich kapiere derzeit nicht ganz, was Du mit der 
logischen Negierung hier bezwecken willst. "tast = !tast;" ergibt für 
"tast" eine 0, wenn auch nur irgendein Bit in tast gesetzt ist (also 
wenn tast ungleich 0 ist) und 1, wenn tast gleich 0 ist. Ich vermute 
mal, dass hier eher der Bitkomplement-Operator "~" hingehört... 
Vielleicht verstehe ich aber auch nur den Sinn der Sache nicht.

von Karl heinz B. (kbucheg)


Lesenswert?

Vielleicht solltest du erst mal klein anfangen
und mit einem wesentlich einfacherem Beispiel beginnen.

Gaaanz was simples: Einfach nur ein Relais einschalten,
ohne dass ein Taster gedrückt sein muss, etc.

Und dann schrittweise die restliche Funktionalität in
Betrieb nehmen.
Ansonsten: Ab in den Debugger und das Programm dort mal
simulieren lassen.

von Martin (Gast)


Lesenswert?

ich habe das ganze schon getestet. ohne entprellung funktioniert es. 
Habe lange gebraucht den ADC soweit zu verstehen und damit auch umgehen 
zu können.

Der generierte Source sollte funktionieren da ich ihn schon einzeln 
getestet habe.

Das m sollte ein n werden, ein Tipfehler, stimmt schon.

Ich war froh das mit dem Signal so verstanden zu haben, und wuste leider 
nicht das sich da etwas ändern wird, habe ich so nochnicht gelesen.

Zur Funktion nochmal, bei dem ersten ADC Feld sollen 2 Relais anziehen, 
bei dem zweiten Feld nur eins und bei dem letzen Feld wieder 2 Relais. 
Mit der besonderheit das beim letzten Feld ein anderes Relais anziehen 
soll wenn es länger als 4 sekunden gedrückt wird.

Und mal generell zu dem Source ja ich habe nochnicht viel für µCs 
geschrieben, aber gebe mir mühe es zu verbessern ;)

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.