PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Register an LC-Display



Schirmo
23.05.2013, 17:38
Hallo zusammen,

ich bin momentan in der Weiterbildung zum Staatlich geprüften Techniker und muss mich im Rahmen einer Projektarbeit mit dem Mikrokontroller: ATMEGA32 von Atmel auseinander setzen. Ich bin in dem Gebiet noch ein kompletter Anfänger und weiß in vielen Situation noch nicht, wie ich sie am besten lösen soll.

Mein Vorhaben ist es, die an PA0-PA7 anliegenden TTL-Zustände an einem LC-Display zu übermitteln und anzeigen zu lassen. Ich bin mittlerweile so weit, dass ich Zeichen an das Display übermitteln und anzeigen lassen kann. Ich habe es sogar geschaft, einen Integer zu einem Zeichen zu konvertieren ( itoa() ) und mir diesen dann ausgeben zu lassen. Meine Frage: Ist PORTA eine Speicheradresse oder ein Byte bzw. wie kriege ich diese 8-Bit in ein Zeichen konvertiert?

Ich habe zusätzlich noch eine Bitte. Würde sich eventuell Jemand bereit erklären mir in einem Telefonat via Skype oder ähnlichem die ein oder andere Frage bezüglich Mikrokontroller und C zu beanworten. Vielen Dank schon im Vorraus.

Gruß
Schirmo

robo_tom_24
23.05.2013, 17:44
PORTn ist ein 8bit Register, den Inhalt kannst du als char, unsigned integer mit 8 bit und somit als Byte ansehen...
Wenn du je nach Kombination ein Zeichen ausgeben willst, dann ließt du das Port am besten per Pin Change Interrupt ein, speicherst es in eine Variable, konvertierst die 8 Bit in die üblichen 16 Bit Integer (explizite Datentypkonvertierung) und übergibst diese dann der Funktion itoa() welche dein "displayfertiges" Zeichen erstellt und du es ausgeben kannst ;)

Schirmo
23.05.2013, 18:15
Ich hab es jetzt so versucht, weil ich mich mit dem Interrupts noch nicht so gut auskenne. Funktioniert aber leider immer noch nicht. Ich krieg immer eine 0 und zwei Zeichen die einem = Zeichen ähneln. Die eingabe an PORTA nehme ich vor dem Simulationsstart vor.

int main(void)
{

DDRA = 0x00;
LCDinit();
LCDclr();

char buffer [8];


while (1)
{
LCDhome();

int A = (uint8_t)PORTA;
itoa(A, buffer,10);

LCDstring(buffer, 3);
_delay_ms(1000);
}
}



// uint8_t A = PORTA;
// uint8_t A |= PORTA;
// hat auch nicht funktionerit

radbruch
23.05.2013, 18:33
Eher so:

...
char buffer [8];
char A;

while (1)
{
LCDhome();

A = PINA;
itoa(A, buffer,10);
...

a=PORTA liest die Pegel die an PORT A ausgegeben werden.

Gruß

mic

Schirmo
23.05.2013, 18:53
Mein Problem ist gelöst :)

Ich musste einfach nur PORTn durch PINn ersetzen und jetzt funzt es. Ein großen Dankeschön an euch beiden für die schnelle zielführende Hilfe.

oberallgeier
23.05.2013, 18:55
Hi Schirmo,

willkommen im Forum.

... die an PA0-PA7 anliegenden TTL-Zustände an einem LC-Display zu übermitteln und anzeigen zu lassen ...Die Anzeige des Ports als Integerzahl ist ja eindeutig, aber hat erstmal optisch nicht wirklich viel Aussagekraft, wenn Du die TTL-Zustände präsentieren willst. Die sind nämlich nur high oder low - sozusagen - und da wäre eine binäre Darstellung vielleicht nicht hübscher, würde aber schneller den realen Zustand des Ports vermitteln.

Ich hatte so etwas schon mal an einem LCD gemacht um Steuerbits in einem I²C-IC möglichst störungsfrei zu verändern. Das Ganze sieht so aus:

......http://oberallgeier.ob.funpic.de/rng+bnd_1872_kl.jpg (http://oberallgeier.ob.funpic.de/rng+bnd_1872.jpg)


und im zugehörigen Thread (klick hier) (https://www.roboternetz.de/community/threads/47783-3-Achs-Beschleunigungssensor-sensationell-günstig-!?p=486071&viewfull=1#post486071) steht auch der zugehörige Code (C, mega328, 2x24-LCD) für die Wandlung in 0/1-en.