PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC0 und ADC1 PullUp einschalten



Unregistriert
16.12.2015, 16:24
Ich möchte in meinem Programm ADC0 und ADC1 als Eingang setzten und dazu auch noch den Internen PullUp Widerstand Aktivieren.

Um diese als eingang zu verwenden nutzt man DDRA &= ~ADC0 bzw.DDRA &= ~ADC1 ist das richtig?
Und um den Widerstand zu nutzen PORTA |= ADC0 bzw. PORTA |= ADC1 - Richtig?

Nun die fragen wo muss das im Programm stehen? Wenn ich das einfach in die main Funktion einfüge kommt ein Fehler bei make.

Hubert.G
16.12.2015, 18:20
Ddra &=~(1<<pa0)
porta |=(1<<pa0)
Gehört natürlich groß geschrieben, wird aber automatisch klein, weiss jetzt nicht warum.

Unregistriert
17.12.2015, 07:23
Wird das einfach in die Hauptfunktion geschrieben?
Und ist das jetzt für ADC0 oder ADC1?
Danke

Hubert.G
17.12.2015, 09:26
Das was du als ADC0 und ADC1 bezeichnest sind ja Sonderfunktionen von PA0 und PA1.
Ich habe jetzt keinen Code vom RP6, aber am Anfang von main kann es nicht falsch sein.

oberallgeier
17.12.2015, 09:38
.. ADC0 und ADC1 bezeichnest sind ja Sonderfunktionen von PA0 und PA1 ..Kleine Ergänzung, nur der Vollständigkeit halber: ... Sonderfunktionen beim mega32 bzw. pinkompatiblen Typen dieser Familie ... Das ist der Controller, der am RP6 verwendet wird.
Bei anderen AVR-Typenreihen kann der Analog-Digital-Converter auch anderswo, z.B. auf Port C sein, Beispiel mega328, dann wäre die Zuweisung entsprechend zu modifizieren. Genaues steht immer im Datenblatt, üblicherweise im Kapitel bzw. Abschnitt Pin Descriptions.

Unregistriert
17.12.2015, 15:06
So ich habe jetzt mal das Prgramm mit
DDRA |= ADC0; // Pin als Ausgang
PORTA |= ADC0; // Ausgang auf 1
PORTA &= ~ADC0; // Ausgang auf 0
DDRA &= ~ADC0; // Eingang
PORTA |= ADC0; // Pullup an
PORTA &= ~ADC0; // Pullup aus
geschrieben, das habe ich im Internet so gefunden. Mit DDRA &=~(1<<pa0) PORTA |=(1<<pa0) funktioniert es nicht, da kommt ein Fehler bei make.

Mein Programm sieht jetzt so aus:


#include "RP6RobotBaseLib.h"

int main(void)
{

DDRA &= ~ADC0; // Eingang
PORTA |= ADC0; // Pullup an
DDRA &= ~ADC1; // Eingang
PORTA |= ADC1; // Pullup an

initRobotBase();
startStopwatch1();


while(true)
{
if(getStopwatch1() > 300)
{
writeString_P("\nADC Akku: ");
writeInteger(adcBat, DEC);
writeString_P("\nADC ADC0 ");
writeInteger(adc0, DEC);
writeString_P("\nADC ADC1: ");
writeInteger(adc1, DEC);
writeChar('\n');
setStopwatch1(0);
}
task_ADC();
}
return 0;
}


Nun habe ich Schalter an ADC0 und ADC1 Angeschlossen (zwischen GND und ADC1 bzw. ADC0).
Wenn beide Schalter offen sind bekomme ich im Terminal jeweils einen Wert von ca. 350 Angezeigt - Ist das normal?
Wenn ich jetzt den Schalter an ADC1 Schließe geht ADC1 auf 0 und ADC0 bleibt bei 350.
Wenn ich dann den ADC0 Schalter Schließe geht ADC0 auf 0 aber ADC1 geht ebenfalls auf 0. Das ist nicht normal oder?

Hubert.G
17.12.2015, 15:24
Hab mal die RP6 Libs durchgeschaut. Der ADC ist auf 0 und 1 immer noch aktiv.
Da müsstest du in der RP6RobotBase.h und in der RP6RobotBaseLib.c einiges ändern und löschen, damit du diese beiden Eingänge als digitale Eingänge verwenden kannst.

Unregistriert
18.12.2015, 14:15
Ok, aber selbst wenn ich diese als Analog Eingänge verwende zeigt ADC1 genau den selben wert wie ADC0 an, obwohl an ADC1 gar nichts angeschlossen ist. Woran liegt das?

Hubert.G
18.12.2015, 15:26
Offene Eingänge zeigen Unsinn an, leg den Eingang auf GND.