Hallo zusammen,
ein paar Freunde und ich haben vor ein RC-Boot auf Basis von Solarstrom
zu bauen. Wir sind auch bereits relativ weit!
Die Solarzellen auf dem Boot sollen sich auf einer Plattform befinden,
welche sich zur Sonne ausrichtet. Dazu wollen wir einen Servo mit Relais
ansteuern, die wiederum vom ATmega8 geschaltet werden.
Der ATmega8 vergleich Werte aus Photowiderständen und ermittelt so wo
die Sonne steht(Photowiderstände sind auf der Plattform, drehen sich
also mit) und richtet die Plattform neu aus.
______4______
>>> | | Anordnug der Sensoren an der Plattform
>>> 0| | ">>>" von der Richtung soll die Sonne die
>>> | |3 Solarzellen anstrahlen.
>>> 1| |
>>> |_____________|
2
Nun zu meiner Frage: Ist der Quellcode so richtig?
(Programmieren das erste mal ein AVR)
ADC richtige Einstelllung?
Pin ansteuerung, etc?
Code:
und alle weiteren tun nicht das, was du erwartest. Tutorial nochmals
lesen, wie man Eingänge einliest.
1
PORTB=0;
kommt mehrfach vor, aber niemals sinvoll. Ich würde dafür einen eigenen
Vergleichsblock anlegen, der ausgeführt wird, wenn das Solarpanel
richtig steht.
Auch ist der Ansatz, innerhalb der einzelnen Blöcke nochmals
while-Schlefen zu haben, auch nicht perfekt. Schließlich hast du ja in
main eine große Schleife.
Ich würde das mit nur drei Zuständen lösen: Rechtsrum, linksrum, stehen
bleiben. Da drin dann nur die Ausgänge passend setzen, sonst nichts.
Als letztes bleibt noch die Frage, was du mit "Servo" meinst. Ein
Modellbauservo lässt sich so nicht ansteuern, und dreht auch nicht
endlos in eine Richtung.
Oliver
Die Tatsache, dass da ein paar mal das Wort ADC vorkommt, lässt in mir
den Verdacht aufkeimen, dass du die Photowiderstände mit dem ADC
auslesen willst. Und das geht dann so schon überhaupt nicht.
Aber auch hier weiß das Tutorial Rat. Diesmal sogar in Form einer
fertigen ADC-Auslesefunktion
Wie will man denn Photowiderstaende auslesen, wenn nicht mit einem ADC ?
Was auch immer an diesem ADC sonst noch klebt, ist nicht Bestandteil vom
Code.
Oliver schrieb:
> Tutorial nochmals> lesen, wie man Eingänge einliest.
Es bringt mir nichts das Tutorial endlos oft zu lesen, wenn die
Information, die ich benötige nicht drin steht.
Aber vielleicht kannst du mir ja die Frage beantworten, weil du dich
recht gut auszukennen scheinst:
Die letzten 5 Bits vom ADMUX Register müssen auf den Kanal gestellt
werden, an dem die Spannung gemessen werden soll... Im Tutorial steht
leider nicht, was ich dort reinschreiben muss, um auf den Pin 0 vom Port
C zuzugreifen, bzw auf die anderen Pins von C
Danke ^^
> Die letzten 5 Bits
4 Bits beim Atmega8
> vom ADMUX Register müssen auf den Kanal gestellt werden, an dem die> Spannung gemessen werden soll... Im Tutorial steht leider nicht, was ich> dort reinschreiben muss, um auf den Pin 0 vom Port C zuzugreifen, bzw> auf die anderen Pins von C
Das wäre ziemlich leicht aus dem Datenblatt zu entnehmen gewesen. Aber
ich kann das gerne für dich da nachlesen und vorkauen:
Die Pins PC0 bis PC5 werden ausgewählt, indem man in die MUX-Bits den
entsprechenden Wert (0 bis 5) einträgt.
>Oliver schrieb:>> Tutorial nochmals>> lesen, wie man Eingänge einliest.>Es bringt mir nichts das Tutorial endlos oft zu lesen, wenn die>Information, die ich benötige nicht drin steht.
Wenn du das falsche Tutorial endlos oft liest, bringt das natürlich
nichts.
Hier mal der link zum richtigen:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Und da steht das alles drin. Wie man Eingänge einliest, und auch, wie
das mit dem ADC funktioniert.
Ich zitiere mal:
>Mit diesen 5 Bits wird der zu messende Kanal bestimmt. Wenn man einen einfachen >1-kanaligen ADC verwendet wird einfach die entsprechende Pinnummer des Ports in >die Bits 0...2 eingeschrieben.
Beim Mega8 stimmt das nicht ganz, da sind es nur 4 Bit, aber am Prinzip
ändert sich nichts. So etwas steht dann in der Mutter aller
Informationsquellen, dem Datenblatt zum Mega8. Das ist die ultimative
Referenz, ohne darin nachzusehen, kann man einen AVR nicht
programmieren.
Oliver
Supi, solche Antworten sind doch gleich viel hilfreicher, als "Lies das
Tutorial nochmal" ;-)
Und ich hab nicht das falsche gelesen :P
Und nachdem ich das Tutorial auch noch ein drittes mal gelesen habe und
alle Ratschläge versucht hab zu beherzigen, poste ich hier nochmal die
überarbeitete Version des Codes:
> Nun zu meiner Frage: Ist der Quellcode so richtig?
Der Motor braucht mit dem Verfahren mehr Strom,
als das Solarpanel aus der Sonne gewinnen kann.
Mehr Gelassenheit!
Auch diffuser Himmel bringt euch durcheinander.
Es reichen übrigens 2 Sensoren.
David O. schrieb:
> Zu viele Klammern machen den Code aber auch unübersichtlich, deshalb> lasse ich sie immer weg, wenn es möglich ist ^^
LOL. Mit dem Argument habe ich nicht gerechnet.
Zu wenige Klammern machen aber auch Probleme, wenn man die Prioritäten
der Opratoren nicht auswendig kann oder lernen möchte.
Hallo Zusammen,
leider funktioniert unser Code immer noch nicht.
Ich hoffe ihr könnt mal ein Blick auf ihn werfen und uns mögliche
Fehlerursachen nennen. Problem ist, dass der ATMega8 nichts macht, wenn
man eine Spannung an einen der Eingänge anlegt(es passiert nichts am
Ausgang (links oder rechts drehen)).
Vielen Dank im Vorraus!
> ADCSRA = ADEN | 0b111;
Was soll denn das sein?
Tu dir selbst einen Gefallen und benutze die ADC Routine aus dem
Tutorial so wie sie da drinnen steht. Die Referenz kannst du anpassen,
aber den Rest lässt du erst mal so wie er ist.
Weiters künstelst du nicht mit dem Motor rum, sondern hängst dir erst
mal einfach nur eine LED an einen Ausgang. An den ADC-Eingang (zuerst
experimentierst du nur mit 1 ADC Eingang) hängst du ein Poti (so wie im
Tut angegeben) und schreibst ein Programm, welches die LED einschaltet,
wenn die Spannung am ADC (eingestellt mit dem Poti) über einem Grenzwert
(den du im Programm fix vorgegeben hast) liegt. Durch Drehen des Potis
links rum bzw. rechts rum kannst du die LED ein/aus schalten.
Das ist dein erstes Zwischenziel. Solange du das nicht erreicht hast,
brauchst du nicht weiter machen.
Dein nächstes Zwischenziel ist es, den Grenzwert für den Vergleich über
den 2.ten ADC Kanal einzustellen. D.h. du hast dann 2 Poti. Mit dem
einen stellst du ein, welchen Wert das andere überschreiten muss, damit
die LED leuchtet. Oder du steuerst 2 LED an, jede mit ihrem eigenen
Poti. Im Grunde völlig egal, was du dir als Aufgabenstellung wählst -
Ziel der Übung ist der Umgang mit 2 ADC-Eingangskanälen (die ADC Routine
aus dem Tut hast du immer noch nicht angerührt - ausser der
Referenzspannung - die ist immer noch so wie im Tut angegeben)
Und erst dann arbeitest du dich langsam an die Motoren ran. Immer
Schritt für Schritt, nicht zu viele Änderungen auf einmal.
Tust du das nicht, dann gehts dir so wie es dir jetzt geht: Du stehst
vor einem Code-Haufen der (natürlich) nicht funktioniert und hast keine
Ahnung wo du mit der Fehlersuche anfangen sollst, weil du nichts in
deinem Programm hast, das als bereits funktionierend und getestet
abgehakt werden kann.
Und erst dann, wenn das alles so einigermassen läuft, gehst du her und
mistest die Tut-ADC Routine aus, wie du das möchtest. Aber auch hier
gehst du wieder nicht her und machst eine alles-in-einem-Aufwasch
Rundumkur, sondern du arbeitest wieder in kleinen Schritten. Wenn in
einem funktionierendem Programm eine kleine Veränderung gemacht wird und
hinterher funktioniert es nicht mehr, dann hat man nur diese kleine
Veränderung zu analysieren was da schief lief. Ändert man aber zuviel,
dann weiß man nicht, welche der zig Änderungen für das
Nichtfunktionieren verantwortlich ist.