Also eigentlich ein einfaches Problem - man nehme eine Spannung und schließe sie an den analog comparator des Controllers an (AIN1), als Referenz dient ein Spannungsteiler, der ca. 2,1V liefert (AIN0). Zur Auswertung dient eine LED. So und dann schreibt man folgenden Code: void main (void) { DDRD = 0b00000000; // PD0,1,2,3,4,5 Eingang PORTD = 0b00000010; // Pull-up PD1 DDRB = 0b11100100; // PB0,1 Eingang, PB2,5,6,7 Ausgang ACSR = 0b01000000; while(1) { if ((ACSR & 0b00100000) == 0b00100000) { PORTB = PORTB | 0b01000000; } else { PORTB = PORTB & 0b10100100; } } } Aber es passiert rein gar nix an meiner LED, egal wie sich die varibale Spannung verhält. Liegt das jetzt an meinem Code oder daran, daß es wenn überhaupt nur mit Interrupt funktionert? Danke schonmal vorab.
Wenn das ACBG-Bit in ACSR gesetzt ist, wird die interne Bandgap-Referenz verwendet. Dein Spannungsteiler an AIN0 ist bei der Konfiguration nutzlos. Und nein, man braucht nicht unbedingt einen Interrupt, man kann ACO auch pollen.
ja gut das mit ACBG-Bit weiß ich, am Anfang hab ich es ned benutzt aber weil sich nix tat hab ich probiert, erfolglos. Aber wieso ist mein Spannungsteiler nutzlos?
Jens wrote:
> Aber wieso ist mein Spannungsteiler nutzlos?
Hab ich doch geschrieben: Weil Du das ACBG-Bit gesetzt hast!
ahso ... aber mit : ACSR = 0b00000000; tut sich au nix, egal welche der beiden Spannungen größer zueinander ist, wenn ich nur wüßt warum ...
Wenn Du vielleicht mal erzählen könntest, an welchem Pin die LED hängt und was sonst noch so alles dranhängt...
Funktioniert das Programm bzw. der Controller sonst irgendwie, oder hat der den Betrieb ganz eingestellt? Leuchtet/schaltet die LED basierend auf Taster statt AC? Stimmen die Spannungen an den Pins?
die LED hängt an PB6 Spannung VCC 5V, Vref (AIN0) 2,1V Vsig (AIN1) entweder ca.0V oder ca. 3,1V sonst macht der µC ja noch nix, aber wenn ich den Inahlt der if-Schleife vertausche dann leuchtet die LED die LED über n Taster per Software einschalten geht ... if((PIND & 0b00000010) == 0b00000010)
@ Jens (Gast) >if((PIND & 0b00000010) == 0b00000010) Das kann man auch einfacher schreiben, siehe Bitmanipulation.
1 | if(PIND & (1<<PD1)) |
MfG Falk
ja ich weiß daß das einfacher geht, aber der Mensch is n Gewohnheitstier, wobei das in dem Fall ausnahmsweise nicht das eigentliche Problem ist - wenn ich das gewußt hätte, hätte ich es mit nem OP gemacht
scheinbar ist das Problem der Menschheit ein Rätsel oder?
Jens wrote:
> scheinbar ist das Problem der Menschheit ein Rätsel oder?
Tja, in dem Code, den Du gepostet hast, kann ich keinen fatalen Fehler
entdecken. Vielleicht schickst Du ja mal den kompletten Source-Code.
gut ... oder vielmehr schlecht ... um das Programm komplett zu machen fehlt nur: #include <avr/io.h> #include <avr/signal.h> erstellt hab ich das ganze mit dem Atmel AVR Studio SP3
Jens wrote:
> erstellt hab ich das ganze mit dem Atmel AVR Studio SP3
Da das AVRStudio nur Assembler versteht, gehe ich mal davon aus, dass Du
den WINAVR auch korrekt installiert hast...
ja klar ... ist nicht mein erstes C-Programm und wenn ich anstatt des Komparators einen Taster zur Ansteuerung der LED verwende, dann funktioniert das Ganze ja reibungslos. Mein Controller is übrigens SMD und neu aus der Stange.
Was passiert, wenn Du AIN1 direkt mit VCC oder mit GND verbindest? Kannst Du so die LED zum Leuchten/Verlöschen bringen? Wo in Deinem Code ist festlegt, für welchen Controller compiliert werden soll?
das muß ich ausprobieren - wird ne Fummellei - ist ne geätzte Platine mit SMD-Controller aber mal schauen. im AVR-Studio habe ich ausgewählt, daß mein Controller ein Attiny2313 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.