Forum: Mikrocontroller und Digitale Elektronik hd44780 mit ATXmega / Ansprechen einzelner Pins


von Markus K. (Gast)


Lesenswert?

Hallo,

habe eine kurze Frage, und zwar versuche eich ein Display mit hd44780 
kompatiblen Controller mittels eines Xmega im 4-bit Modus anzusteuern.
Sehr hilfreich war mir bis jetzt folgendes Tutorial für den ATmega:
http://www.mikrocontroller.net/articles/Erweiterte_LCD-Ansteuerung
Soweit sollte der Code ja kompatibel sein, bis auf die Ansteuerung der 
einzelnen Pins mittels PC1, PC2, .... wie es beim ATmega noch möglich 
war und nicht mit PORTC.OUT.

Fällt von hierzu irgendwem eine "einfache" Möglichkeit ein, wie man 
diesen Code adaptieren könnte? Oder gibt es eine andere Möglichkeit beim 
ATxmega einzelne Pins anzusprechen?

Freue mich auf Antworten

lg Markus

von Dom (Gast)


Lesenswert?

Habe zwar mit den xMegas momentan nichts am Hut, aber ich hab grad mal 
kurz gegoogelt.
Hier (http://www.stromflo.de/dokuwiki/doku.php?id=xmega-c-tutorial) gibt 
es ein Tutorial.
Von einzelnen Pins steht da auch was - wäre schon sehr seltsam wenn das 
nicht mehr gehen sollte ^^

von Dom (Gast)


Lesenswert?

Gerade noch mal drüber geschaut...
Das scheint doch mehr oder weniger noch zu funktionieren wie schon 
immer...
Nur heißen die die Pins jetzt nicht mehr PCx, sondern an jedem Port 
PINx.

von Dom (Gast)


Lesenswert?

Nochmal ^^
Deine Defines müssten dann wohl so in der Art aussehen (ohne Garantie 
:))...
1
#ifndef LCD_PORTS
2
#define LCD_PORTS
3
 
4
#define LCD_PORT      PORTE.OUT
5
#define LCD_DDR       PORTE.DIR
6
 
7
// 4 Bit LCD Datenbus DB4-DB7, das unterste Bit DB4 kann auf den Portbits 0..4 liegen
8
 
9
//  LCD DB4-DB7 <-->  PORTC Bit PC0-PC3
10
#define LCD_DB        PIN0
11
 
12
// LCD Steuersignale RS und EN
13
 
14
//  LCD RS      <-->  PORTC Bit PC4     (RS: 0=Data, 1=Command)
15
#define LCD_RS        PIN4
16
 
17
//  LCD EN      <-->  PORTC Bit PC5     (EN: 1-Impuls für Daten)
18
#define LCD_EN        PIN5
19
 
20
#endif // LCD_PORTS

Und so weiter...

von Markus K. (Gast)


Lesenswert?

Vielen Dank erstmal für deine Antwort,

habs mal umgeschrieben, und nun sind es auch nur noch 7 Fehler, aber da 
stehe ich doch auch shcon wieder an:

../lcd.c:16: error: invalid operands to binary | (have 'PORT_t' and 
'int')

Bitte weiter um Hilfe.

lg Markus

von Dom (Gast)


Lesenswert?

Stell' doch bitte mal den kompletten Code rein.
Mit den Schnippseln ist es schwierieg zu erraten :)

von Karl H. (kbuchegg)


Lesenswert?

Markus K. schrieb:
> Vielen Dank erstmal für deine Antwort,
>
> habs mal umgeschrieben, und nun sind es auch nur noch 7 Fehler, aber da
> stehe ich doch auch shcon wieder an:
>
> ../lcd.c:16: error: invalid operands to binary | (have 'PORT_t' and
> 'int')

Da ist der Compiler aber heikel

Er bemängelt dass er in

   PORTE.OUT |= ( 1 << PIN0 );

(denn darauf läuft es hinaus, wenn man die Makros substituiert) auf der 
linken Seite einen PORT_t Datentyp hat, während die rechte Seite zu 
einem int evaluiert.

Formal ist das alles korrekt und der Compiler hat recht, wenn ein PORT_t 
Datentyp nichts ist, was automatisch in einen int konvertiert werden 
kann.

Mach halt erst mal ein paar Vortests mit einfachen Programmen ala
1
#include <avr/io.h>   
2
3
int main (void)
4
{            
5
   PORTE.DIR = 0xff;
6
 
7
   while(1) {                
8
     PORTE.OUT |= (1<<PIN0);
9
   }                      
10
 
11
   return 0;                 
12
}
und sieh dir ein wenig an, wie du das schreiben musst, damit der 
Compiler nix mehr zu meckern hat.
Und mit dem Wissen gehst du dann daran, die lcd.h (oder auch den Code in 
lcd.c) anzupassen.
Wenn man Makros schreibt oder an eine andere Syntax anpassen muss, dann 
fängt man 'hinten' an. Zuerst muss klar sein, was nach der Makro 
Substitution überhaupt rauskommen soll. Und erst dann schreibt man das 
Makro und verpackt somit Teile aus dem gewünschten Ergebnis in Makros 
und gibt ihnen Namen.

von Markus K. (Gast)


Lesenswert?

Hallo,

vielen Dank für eure Antworten(meine ist jetzt leider ein bisschen spät)
Karl Heinz Buchegger, du hattes vollkommen recht, wieder etwas klüger. 
So wie ich das sehe(nur kompiliert und noch nicht ausgeführt 0 Fehler :) 
)reicht es einfach in lcd.c (siehe AVR Tutorial) an "LCD_PORT" ein 
".OUT" anzuhängen, was das ganze natürlich etwas klarer macht ;).
lg und vielen Dank

Markus

von XMEGA (Gast)


Lesenswert?

Hallo,

Markus K. schrieb:
> Bitte weiter um Hilfe.

schau dir mal den Code an!

http://blog.frankvh.com/2010/10/18/atmel-xmega-hd44780-lcd-support/


Gruß XMEGA

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
Noch kein Account? Hier anmelden.