Hey Leute,
ich habe in der Schule ein µC Projekt bekommen. (Da wir nun schon einige
Zeit in C programiert haben). Ich und mein Partner wollen ein Lego
Kettenfahrzeug steuern.
Blablabla....
Da wir mit den Schulboards nur Probleme haben haben wir uns ein eigenes
Baord angeschafft.
(http://www.steitec.net/AVR-Boards/BASE-AVR-ATMEGA64.html)
Mit dem ALL AVR von Reichelt kommen wir auch aufs Baord drauf (Laut
Status Meldungen von AVR Studio 4)
WinAVR2010 ist instaliert und die avr-gcc file und makefile sind
eingebunden.
Folgender Programmcode:
1
#include<avr/io.h>
2
3
intmain(void)
4
{
5
6
DDRA=0xFF;
7
8
while(1)
9
{
10
PORTA=0xFF;
11
}
12
return0;
13
}
Trozdem können wir keine Spannung an den Ausgangspins am Controller
messen.
Hoffe ihr könnt mir helfen.
Grüße
Hey,
kein Fehler beim übertragen des Programms (lauf AVR Studio).
Spannung am Resetpin 4,9V.
9Volt(Metzteil), Spannugnsregler 4,9V.
Hab es wieder ausprobiert der Controller setzt den Port nicht!....
Grüße
Hey nochmal,
entweder ich habe falsch gemessen oder zu blöd zum Lesen. Das
Testprogramm läuft jetzt.
Nun habe ich versucht das richtige Programm zu testen aber da wie
erwartet nichts kann jemand helfen ich Poste den Programmcode mal als
Anhang.
Ich vermute das ich den ADC Wert falsch auslese und davon ist nunmal das
gesamte Progamm abhänig.
Grüße
So wie ich das im Schaltplan sehe kannst du keine interne
Referenzspannung einstellen, AREF ist mit ext.VCC verbunden.
Du musst auch ADCH abfragen oder Ausgabe linksbündig und nur ADCH.
Ansonst wird das Register nicht erneut beschrieben. Datenblatt lesen:
When ADCL is read, the ADC Data Register is not updated until ADCH is
read. Consequently,
if the result is left adjusted and no more than 8-bit precision is
required, it is
sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH.
Hey hab ma nur ein AD Programm versucht zu schreiben aber es scheint so
als ob er den AD Wert nur einmalig ausliest und ausgibt. Veränder ich
den ADWert ändert sich nichts an der Ausgabe. Code im Anhang
Was ich vorher geschrieben habe hast du nicht gelesen?
ADMUX = ADMUX | 0b11111;
k = i & 0b00011111;
k = k|0b11100000;
ADMUX = ADMUX & k;
Kannst du mal dazuschreiben was du hier machen willst.
Was ich vorher geschrieben habe hast du nicht gelesen?
ADMUX = ADMUX | 0b11111;
k = i & 0b00011111;
k = k|0b11100000;
ADMUX = ADMUX & k;
Kannst du mal dazuschreiben was du hier machen willst.
Für einen ADC-Test wäre etwas einfacheres besser.
Doch Linksbündig mit dem Adlar und dan nur das ADCH auslesen. Hat
irgentwie nicht funktioniert.
Hab den Code falsch kopiert eig sollte da das hier stehn.
1. ADMUX = ADMUX | 0b00011111;
2. k = i & 0b00011111;
3. k = k|0b11100000;
4. ADMUX = ADMUX & k;
1. Die 5 LSB sind zum Channel auswählen. Ich will erstmal alle auf 1
Setzen.
2. In dert Variable k speicher ich dan den Channel indem ich i mit
0x00011111 verknüpfe. i wird in der forschleife hochgezählt um jedes mal
einen Channel höher zu wählen.
3. Ich verknüpfe k mit 0b1110000 um k auf 0b111+Channel bits von i
setze.
4. Ich verknüpfe das ADMUX mit k damit im ADMUX der Channel steht UND
die vorher gesetzen Bits (Die 3 MSB) (Um die Ref spannung und das ADLAR
nicht zurückzusetzen).
grüße
Hab das mal simuliert, da funktioniert es.
Allerdings machst du einige Sachen die nicht gut sind.
Mach nach dem ADC_Main(); noch ein delay, sonst läuft das so schnell
durch das du ohnehin nichts siehst.
Register die sich nicht ändern setzt man nicht immer wieder neu, das
macht man im main vor der while. Wie das hier:
ADMUX = 0; //Zurücksetzen der Register
ADCSRA = 0; //Zurücksetzen der Register
ADMUX |= (0<<REFS1) | (1<<REFS0); //Interne AVCC als Referenz
einstellen
ADMUX |= (1<<ADLAR); //AD-Werte werden Rechtsbündig gespeichert
ADCSRA |= (1<<ADEN); //AD Enable
ADCSRA |= 0b00000111; //Frequenzteiler einstellen (fOsc/128)
Ich schau mal drüber. In der Simulation funktionierter mein Programm ja
auch nur aufem Controller konte ich es nicht messen das er den Port
ändert bzw anpasst.
Ich habe das jetzt mal auf meinem Testboard aufgebaut, funktioniert
einwandfrei.
Allerdings kannst du auf PortA keine Leds hängen, das ist der ADC-Port.
Das mit PortF ist klar, ich teste es auf einem Mega32. Der ist in dem
Bereich kompatibel.
1
ADMUX|=(1<<ADLAR);//AD-Werte werden Rechtsbündig gespeichert
Der Kommentar ist falsch. Hier wird der Wert linksbündig gespeichert,
sonst würde das ADCH auslesen keinen Sinn machen.
In die for-Schleife noch ein _delay(500): einfügen. Wenn es sich sonst
ergibt das alle Leds einmal aufleuchten, hat es den Anschein als ob
immer alle leuchten würden.
In der Simulation fliegt der bei dem Delay immer raus. Auf dem Boiard
funktioniert die AD Wandlung nur im Testprogramm hier der Aktuelle code.
Mal eine Frage, oben bei den deklarationen für die Zuweisung der Ports
ist das richtig wenn man PC0,PC1,PC2...etc. schreibt oder ist das der
fehler?
Grüße
Hi
>Bei meinem ATMega64 ist der PortF der ADC Port.
Und du weisst auch, das dort das JTAG-Interface liegt, das im
Auslieferzustand eingeschaltet ist?
PF4...PF7 sind damit nicht nutzbar.
MfG Spess
TCCR1A=(1<<WGM10)|(1<<COM1A1)|(1<<COM1A0);// Bit WGM10 des Registers TCCR1A High setzen
4
TCCR1B=(1<<CS11)|(1<<CS10);// Bit CS11 und CS10 des Register TCCR1B High setzen
5
}
Ein Beispiel für unnötige / schlechte Kommentare. Auch ohne erkennt
Jeder, dass da Bits gesetzt werden. Viel sinnvoller wäre es zu
schreiben, was das bringt.
Also zum Beispiel: Prescaler 256, CTC Match aktiv (Ich habe nicht im
Datenblatt geguckt, ist nur ein Beispiel)
eRay schrieb:> In der Simulation fliegt der bei dem Delay immer raus.
Ist bei mir (zumindest ín AVR-Studio 5) auch so.
Ok wenn es nicht stört zurück zum Problem. Ich verstehe nicht welche
Adressen die einzelnen Portbits haben. Im Datenblatt steht PROTC 0x35
aber für DDRC 0x34.
Moemntan scheitert es daran das ich die PortBITS nicht einzeln setzen
kann
eRay schrieb:> Mal eine Frage, oben bei den deklarationen für die Zuweisung der Ports> ist das richtig wenn man PC0,PC1,PC2...etc. schreibt oder ist das der> fehler?
Das ist falsch. In den Defines für PC0, PCx steht nur 0, x drin. Also
schreibst du hier:
1
intV1_1=PC0;//--> entspricht int V1_1 = 0; //Ventil Ausleger hoch
2
intV1_2=PC1;//--> entspricht int V1_2 = 1; //Ventil Ausleger runter
Danke Christian F. ...das habe ich eben auch gemerkt. Nun hab ich die
alle erst auf 0 gesetzt. Nun will ich die Varibalen aber auf einen
einzelnen Portbit legen (Die Variablen enthalten nur 0 oder 1).
eRay schrieb:> Ok wenn es nicht stört zurück zum Problem. Ich verstehe nicht welche> Adressen die einzelnen Portbits haben. Im Datenblatt steht PROTC 0x35> aber für DDRC 0x34.>> Moemntan scheitert es daran das ich die PortBITS nicht einzeln setzen> kann> PORTC0 = V1_1;> PORTC1 = V1_2;> PORTC2 = V2_1;> PORTC3 = V2_2;> PORTC4 = V3_1;> PORTC5 = V3_2;> PORTC6 = Kranz_an;> PORTC7 = Kranz_LR;>> PORTA0 = ML_Z;> PORTA1 = MR_Z;>> Muss ich da statt PORTC0, PC0 schreiben?>>> grüße
Es muss zum setzen heißen:
eRay schrieb:> Danke Christian F. ...das habe ich eben auch gemerkt. Nun hab ich die> alle erst auf 0 gesetzt. Nun will ich die Varibalen aber auf einen> einzelnen Portbit legen (Die Variablen enthalten nur 0 oder 1).
Wenn ich dich richtig verstehe, müsstest du es so machen:
eRay schrieb:> Also wenn ich es von einer Variable abhänig machen will muss ich das so> schreiben?>>> if(V1_1 == 1)> {> PORTC |= (1<<PC0);> }> else> {> PORTC &= ~(1<<PC0);> }
Ja.
danke Christian....das man das extra difinen muss wusste ich nichgt
zumindest hat er beim ersten mal immer nen fehler rausgeschmissen ich
probier das aus danke =)