Guten Tag zusammen, Ich bin grade dabei eine Lüftersteuerung mit 12V Lüfter zu programmieren. Ich habe einen Subprint der auf meine platine passt der dann zum ATmega16 führt. Dazu hab ich auch Einen Mysmart USB Mk2 zum übertragen (MYAVR_PROGTOOL) Ich programmiere in C und benutzt AVR Studio 6.2. Auf meine Platine Hab ich ein LCD mit rein gebaut der mit Port B verbunden ist. >(der LCD is ein HD44780 von Hitachi) Leider dadurch das ich einen PWM Signal benutzt, musste ich leider PB3 als ausgang für den PWM. Alle Andere Pins von PORTB können noch angeschlossen werden. (dazu ist mir klar das der LCD nicht mehr in 8-Bit Modus arbeiten kann, sondern jetzt nur noch in 4-bit Modus) Wie komm ich in 4-bit modus? Ich arbeite schon eine weile mit C, und kenn mit ein bisschen aus(LCD leider noch nie). Ich hab die LCD Library aber weiss nicht wie ich es in meinem programm mit einbinden kann. Ich kann meinen Code den ich geschrieben hab hier mit einfügen als Notepad Datei. Im voraus will ich mich herzlich bedanken für jeden hilfreichen Beitrag. (Sorry wenn hier Schreibfehler sind, lebe nur seit 3 jahren in Deutschland) Mfg. Marius
Nun ja, neben den Datenleitungen, benötigst du auch noch Steuerleitugen. Du musst ja nicht für alle Leitungen einen Port benutzen. Du kanns auch die Leitungen von verschiedenen Ports nehemen und die Software dementsprechend anpassen. Dann kannst du auch im 8-Bit-Modus arbeiten. In den 4-Bit-Modus kommst du bei der Initialisierung des LCD. Der Ablauf der Initialisierung, also was geschickt werden muss und wie lange gewartet werden muss, steht im Datenblatt. Johannes
@johannes: Danke für die schnelle antwort, mir ist bewusst das ich verschiedene port pins benutzen kann, aber meine platine ist schon fertig, und da kann ich nichts drann ändern (ausser ich bastell mir nochmal so eine platine) das ist eine zeit und geld verschwendung.... also der LCD ist so verbunden das der PB3 mit D3 glaubich wars angeschlossen, im 4-bit modus benutzt man ja D4-D7 glaub ich... ja also ich hab mir das datenblatt durchgelesen, aber ich versteh immer nochnicht wie ich den LCD library den ich hergestellt hab in meinen programm einbinden kann (der LCD library ist eine extra C-file den ich gemacht hab) muss ich die initialisierung im hauptprogramm angeben oder im LCD library? wenn du die datei brauchst kann ich die schnell hochladen... Danke nochmal für deinen beitrag :) mit freundlichen grüßen, Marius
Hallo, ich habe mal Code herausgekramt mit dem ich vor langer Zeit mal mit dem HD44780 gearbeitet habe. Vielleicht hilft es dir etwas weiter. Ein Blick ins Datanblatt ist auch sinnvoll. Ist aber schon länger als 10 Jahre her. Bei der Displayprogrammierung ist die größte Hürde immer die Initialisierungsroutine. Wenn mal irgendetwas angezeigt wird, dann wird es einfacher. Gruß Markus
1 | #include <avr/io.h> |
2 | #include <avr/pgmspace.h> |
3 | |
4 | #include "HD44780.h" |
5 | #include "timer.h" |
6 | |
7 | #define LCD_RS PD4
|
8 | #define LCD_RW PD5
|
9 | #define LCD_E PD6
|
10 | #define LCD_D4 PC4
|
11 | #define LCD_D5 PC5
|
12 | #define LCD_D6 PC6
|
13 | #define LCD_D7 PC7
|
14 | #define LCD_DATA_O_PORT PORTC
|
15 | #define LCD_DATA_I_PORT PINC
|
16 | #define LCD_DATA_R_PORT DDRC
|
17 | |
18 | #define HD44780_CLR 0x01
|
19 | #define HD44780_HOME 0x02
|
20 | #define HD44780_ENTMODE(inc, shift) (0x04|(inc? 0x02: 0)|(shift? 1: 0))
|
21 | #define HD44780_DISPCTL(disp, cursor, blink) \
|
22 | (0x08|(disp? 0x04: 0)|(cursor? 0x02: 0)|(blink? 1: 0))
|
23 | #define HD44780_SHIFT(shift, right) \
|
24 | (0x10|(shift? 0x08: 0)|(right? 0x04: 0))
|
25 | #define HD44780_FNSET(if8bit, twoline, font8x10) \
|
26 | (0x20|(if8bit? 0x10: 0)|(twoline? 0x08: 0)|(font8x10? 0x04: 0))
|
27 | #define HD44780_CGADDR(addr) (0x40|(addr & 0x3f))
|
28 | #define HD44780_DDADDR(addr) (0x80|(addr & 0x7f))
|
29 | #define HD44780_BUSYFLAG 0x80
|
30 | |
31 | #define LCD_E_ON sbi(PORTD, LCD_E)
|
32 | #define LCD_E_OFF cbi(PORTD, LCD_E)
|
33 | |
34 | #define LCD_RS_ON sbi(PORTD, LCD_RS)
|
35 | #define LCD_RS_OFF cbi(PORTD, LCD_RS)
|
36 | |
37 | #define LCD_RW_ON sbi(PORTD, LCD_RW)
|
38 | #define LCD_RW_OFF cbi(PORTD, LCD_RW)
|
39 | |
40 | |
41 | #define LCD_OUTCMD(n) lcd_outbyte(n, 0)
|
42 | #define LCD_OUTDATA(n) lcd_outbyte(n, 1)
|
43 | #define lcd_incmd() lcd_inbyte(0)
|
44 | #define lcd_indata() lcd_inbyte(1)
|
45 | |
46 | |
47 | static inline void lcd_pulse_e(void) |
48 | {
|
49 | LCD_E_ON; |
50 | asm volatile("nop");/* guarantee 1000 ns high */ |
51 | asm volatile("nop"); |
52 | asm volatile("nop"); |
53 | asm volatile("nop"); |
54 | LCD_E_OFF; |
55 | }
|
56 | |
57 | void lcd_outnibble(uint8_t n, uint8_t rs) |
58 | {
|
59 | // LCD_RS_OFF;
|
60 | if (rs) |
61 | LCD_RS_ON; |
62 | else
|
63 | LCD_RS_OFF; |
64 | |
65 | // Zuerst alle Ports zurück setzen
|
66 | cbi(LCD_DATA_O_PORT, LCD_D4); |
67 | cbi(LCD_DATA_O_PORT, LCD_D5); |
68 | cbi(LCD_DATA_O_PORT, LCD_D6); |
69 | cbi(LCD_DATA_O_PORT, LCD_D7); |
70 | |
71 | if ( n & 0x01) |
72 | sbi(LCD_DATA_O_PORT, LCD_D4); |
73 | if ( n & 0x02) |
74 | sbi(LCD_DATA_O_PORT, LCD_D5); |
75 | if ( n & 0x04) |
76 | sbi(LCD_DATA_O_PORT, LCD_D6); |
77 | if ( n & 0x08) |
78 | sbi(LCD_DATA_O_PORT, LCD_D7); |
79 | |
80 | lcd_pulse_e(); |
81 | }
|
82 | |
83 | void lcd_outbyte(uint8_t b, uint8_t rs) |
84 | {
|
85 | lcd_outnibble(b >> 4, rs); |
86 | delay(1); |
87 | lcd_outnibble(b & 0xf, rs); |
88 | delay(1); |
89 | }
|
90 | |
91 | |
92 | void InitHD44780(void) |
93 | {
|
94 | IoInit(); |
95 | |
96 | delay(30); |
97 | |
98 | |
99 | LCD_E_OFF; |
100 | LCD_RW_OFF; |
101 | LCD_RS_OFF; |
102 | // Reset
|
103 | lcd_outnibble(0x03, 0); |
104 | delay(5); |
105 | lcd_outnibble(0x03, 0); |
106 | delay(1); |
107 | LCD_OUTCMD(0x32); |
108 | // (1)Mode 4 Bit
|
109 | LCD_OUTCMD(0x28); |
110 | // (2)Entry Mode
|
111 | LCD_OUTCMD(0x06); |
112 | // (3)Display On/Off
|
113 | LCD_OUTCMD(0x0E); |
114 | // (4)Display Clear
|
115 | LCD_OUTCMD(0x01); |
116 | delay(3); |
117 | // End Init
|
118 | |
119 | // (5) DD RAM 1st Digit
|
120 | LCD_OUTCMD(0x80); |
121 | |
122 | // Daten Senden
|
123 | LCD_OUTDATA(0x30); |
124 | LCD_OUTDATA(0x31); |
125 | LCD_OUTDATA(0x32); |
126 | LCD_OUTDATA(0x33); |
127 | LCD_OUTDATA(0x34); |
128 | LCD_OUTDATA(0x35); |
129 | LCD_OUTCMD(0x01); |
130 | delay(2); |
131 | }
|
132 | |
133 | |
134 | void WriteStringToDisplay( char * pcStr, BYTE byPos) |
135 | {
|
136 | char *pc; |
137 | BYTE byDDPos = byPos; |
138 | byDDPos |= 0x80; |
139 | pc = pcStr; |
140 | LCD_OUTCMD( byDDPos); |
141 | while( *pc != '\0') |
142 | {
|
143 | LCD_OUTDATA(*(pc++)); |
144 | }
|
145 | }
|
146 | |
147 | |
148 | void FillLine( char pcChar, BYTE byPos) |
149 | {
|
150 | BYTE cc; |
151 | BYTE byDDPos = byPos; |
152 | byDDPos |= 0x80; |
153 | LCD_OUTCMD( byDDPos); |
154 | for (cc = 0; cc < DISPLAY_LINE_LEN; cc++) |
155 | {
|
156 | LCD_OUTDATA( pcChar); |
157 | }
|
158 | |
159 | }
|
:
Bearbeitet durch Moderator
Marius schrieb: > Lueftersteuerung_Subprint_Schaltplan.jpg Ein Tip: Wenn du deinen Schaltplan gleich als PNG-Datei erzeugst, wird das nicht so ein Pixelgematsche. Die JPEG-Kompression ist für Linienzeichnungen mit scharfen Kontrasten nunmal denkbar ungeeignet. Wozu wird beim Upload eigentlich der Hinweis angezeigt?
Kopfschüttel schrieb: > Ein Tip: > Wenn du deinen Schaltplan gleich als PNG-Datei erzeugst, wird das nicht > so ein Pixelgematsche. Die JPEG-Kompression ist für Linienzeichnungen > mit scharfen Kontrasten nunmal denkbar ungeeignet. > > Wozu wird beim Upload eigentlich der Hinweis angezeigt? Erm Danke für deinen negativen beitrag? Soll das nicht grad egal sein solang man den schaltplan sehen kann? Ich hab jetzt hier den LCD Library den ich hergestellt hab um den LCD in 8-bit modus zu betreiben:
1 | #define F_CPU 4000000
|
2 | |
3 | #include <avr/io.h> |
4 | #include <util/delay.h> |
5 | |
6 | void enable (void) |
7 | {
|
8 | PORTD = 0x80; |
9 | _delay_ms(5); |
10 | PORTD = 0x00; |
11 | }
|
12 | |
13 | void LCDFreigabe (void) |
14 | {
|
15 | _delay_ms(18); |
16 | for (unsigned char i=3; i!=0; i--) |
17 | {
|
18 | PORTB = 0x30; |
19 | enable (); |
20 | _delay_ms(18); |
21 | }
|
22 | |
23 | PORTB = 0x38; //Funktion Set |
24 | enable(); |
25 | _delay_ms(2); |
26 | |
27 | PORTB = 0x0C; //Display ON/OFF |
28 | enable(); |
29 | _delay_ms(2); |
30 | |
31 | PORTB = 0x01; //Display löschen |
32 | enable(); |
33 | _delay_ms(2); |
34 | |
35 | PORTB = 0x06; //Entry Mode Set |
36 | enable(); |
37 | _delay_ms(2); |
38 | }
|
39 | void zeile2(unsigned char zelle) |
40 | {
|
41 | _delay_ms(2); |
42 | PORTD = 0x80; |
43 | PORTB = 0x80+zelle; |
44 | PORTD = 0x00; |
45 | _delay_ms(2); |
46 | }
|
47 | |
48 | void ausgabe (unsigned char buchstabe) |
49 | {
|
50 | PORTD = 0xA0; |
51 | PORTB = buchstabe; |
52 | PORTD = 0x00; |
53 | _delay_ms(2); |
54 | }
|
55 | |
56 | void Ag (void) { ausgabe(0x41);} |
57 | void Bg (void) {ausgabe(0x42);} |
58 | void Cg (void) {ausgabe(0x43);} |
59 | void Dg (void) {ausgabe(0x44);} |
60 | void Eg (void) {ausgabe(0x45);} |
61 | void Fg (void) {ausgabe(0x46);} |
62 | void Gg (void) {ausgabe(0x47);} |
63 | void Hg (void) {ausgabe(0x48);} |
64 | void Ig (void) {ausgabe(0x49);} |
65 | void Jg (void) {ausgabe(0x4A);} |
66 | void Kg (void) {ausgabe(0x4B);} |
67 | void Lg (void) {ausgabe(0x4C);} |
68 | void Mg (void) {ausgabe(0x4D);} |
69 | void Ng (void) {ausgabe(0x4E);} |
70 | void Og (void) {ausgabe(0x4F);} |
71 | void Pg (void) {ausgabe(0x50);} |
72 | void Qg (void) {ausgabe(0x51);} |
73 | void Rg (void) {ausgabe(0x52);} |
74 | void Sg (void) {ausgabe(0x53);} |
75 | void Tg (void) {ausgabe(0x54);} |
76 | void Ug (void) {ausgabe(0x55);} |
77 | void Vg (void) {ausgabe(0x56);} |
78 | void Wg (void) {ausgabe(0x57);} |
79 | void Xg (void) {ausgabe(0x58);} |
80 | void Yg (void) {ausgabe(0x59);} |
81 | void Zg (void) {ausgabe(0x5A);} |
82 | void as (void) {ausgabe(0x61);} |
83 | void bs (void) {ausgabe(0x62);} |
84 | void cs (void) {ausgabe(0x63);} |
85 | void ds (void) {ausgabe(0x64);} |
86 | void es (void) {ausgabe(0x65);} |
87 | void fs (void) {ausgabe(0x66);} |
88 | void gs (void) {ausgabe(0x67);} |
89 | void hs (void) {ausgabe(0x68);} |
90 | void is (void) {ausgabe(0x69);} |
91 | void js (void) {ausgabe(0x6A);} |
92 | void ks (void) {ausgabe(0x6B);} |
93 | void ls (void) {ausgabe(0x6C);} |
94 | void ms (void) {ausgabe(0x6D);} |
95 | void ns (void) {ausgabe(0x6E);} |
96 | void os (void) {ausgabe(0x6F);} |
97 | void ps (void) {ausgabe(0x70);} |
98 | void qs (void) {ausgabe(0x71);} |
99 | void rs (void) {ausgabe(0x72);} |
100 | void ss (void) {ausgabe(0x73);} |
101 | void ts (void) {ausgabe(0x74);} |
102 | void us (void) {ausgabe(0x75);} |
103 | void vs (void) {ausgabe(0x76);} |
104 | void ws (void) {ausgabe(0x77);} |
105 | void xs (void) {ausgabe(0x78);} |
106 | void ys (void) {ausgabe(0x79);} |
107 | void zs (void) {ausgabe(0x7A);} |
108 | void ae (void) {ausgabe(0xE1);} |
109 | void nulln (void) {ausgabe(0x30);} |
110 | void eins (void) {ausgabe(0x31);} |
111 | void zwei (void) {ausgabe(0x32);} |
112 | void drei (void) {ausgabe(0x33);} |
113 | void vier (void) {ausgabe(0x34);} |
114 | void fuenf (void) {ausgabe(0x35);} |
115 | void sechs (void) {ausgabe(0x36);} |
116 | void sieben (void) {ausgabe(0x37);} |
117 | void acht (void) {ausgabe(0x38);} |
118 | void neun (void) {ausgabe(0x39);} |
119 | void leer (void) {ausgabe(0x20);} |
120 | void prozent (void) {ausgabe(0x25);} |
121 | void strich (void) {ausgabe(0x2D);} |
122 | void doppelpunkt (void) {ausgabe(0x3A);} |
123 | void punkt (void) {ausgabe(0x2E);} |
Ich hab auch diese seite offen um zu vergleichen und vllt mit copy/paste es zusammenzustellen. Kann mir jemand sagen was ich noch ändern muss? Danke mfg. Marius
:
Bearbeitet durch Moderator
Verwende die LCD-Lib von Peter Fleury, dann erledigen sich deine Probleme von selbst.
Marius schrieb: > Kopfschüttel schrieb: >> Ein Tip: >> Wenn du deinen Schaltplan gleich als PNG-Datei erzeugst, wird das nicht >> so ein Pixelgematsche. Die JPEG-Kompression ist für Linienzeichnungen >> mit scharfen Kontrasten nunmal denkbar ungeeignet. > Erm Danke für deinen negativen beitrag? > Soll das nicht grad egal sein solang man den schaltplan sehen kann? Nein. Es ist einfach das falsche Format. > Ich hab jetzt hier den LCD Library den ich hergestellt hab um den LCD in > 8-bit modus zu betreiben Das hier steht über jeder Eingabebox:
1 | Antwort schreiben |
2 | Wichtige Regeln - erst lesen, dann posten! |
3 | ... |
4 | Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang |
5 | ... |
6 | Formatierung |
7 | [c]C-Code[/c] |
8 | ... |
9 | Bitte das JPG-Format nur für Fotos und Scans verwenden! |
10 | Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen. |
Ist es denn soooo schwer? Kopfschüttel schrieb: > Wozu wird beim Upload eigentlich der Hinweis angezeigt? Wozu wird direkt beim Eingabefeld diese Information dargerstellt? > lueftersteuerung_backup_C.txt Gib das nächste Mal der C-Datei auch die Dateiendung *.c Das macht den Code viel lesbarer. Probiers aus...
ich würde dir ein 573er Latch empfehlen. Funktioniert wie folgt du legst an einen Port deine 8 Bits an, klingelst mit einer Steuerleitung wodurch der Latch die Daten an seinen Eingängen übernimmt und an seine 8 Ausgangspins gibt, danach schaltet man mit einer weiteren Leitung die Latcheingänge hochohmig wodurch sie deine Schaltung dann nicht mehr beeinflussen. Nun kannst du deinen kompletten Port wieder für andere Sachen verwenden. Und dein LCD erhält die 8 Bits vom Latch, du musst dich dann nur doch um die Steuerleitungen kümmern. Ich habe das sonst immer mit einem kleinen ATTiny26 so gemacht um trotz 8 Bit Modus nicht alles Pins für das LCD zu opfern.
Marius schrieb: > Soll das nicht grad egal sein > solang man den schaltplan sehen kann? Vor allem der richtige Schaltplan zu der Frage wäre mal interessant.
Marius schrieb: > Soll das nicht grad egal sein solang man den schaltplan sehen kann? Gehst zum Autohändler und willst ein AMG. Der stellt dir ein Pferdefuhrwerk hin und sagt: "Wieso - fährt doch auch". Kein weiterer Kommentar
Ich will ja nicht kleinlich sein, aber zum richtigen Funktionieren (-->Funktionssicherheit!) gehört ein Abblock-C an jedem VCC Pin des Controllers. Da fehlt einer im gezeigten Schaltplan ....
Schaltplanleser schrieb: > Ich will ja nicht kleinlich sein, Naja, erstmal müsste der richtige Schaltplan da sein. Aber an dem bisherigen ist noch mehr falsch, ARef gehört auch nicht an VCC.
:
Bearbeitet durch User
Guten Morgen erstmal, Danke für die Schönen kommentare, Wie ich glaub ich schon gesagt hab, lebe ich seit 3 jahren in Deutschland (aus US hergezogen) mir ist bewusst das nicht jeder Deutsche net ist. Aber das man so frech über einen forum wo man eigentlich nur hilfe haben möchte echt low. Soll ich einfach auf english weiter schreiben? vielleicht versteht ihr das ganze besser. 1. Der Schaltplan der angegeben ist oben als PNG file (sorry for all the butthurt who cant handle the file type) IST der Subprint der über eine Stiftleiste beim ATmega16 angeschlossen! 2. Dieser SUBPRINT wird auf die Hauptplatine die ICH selber gemacht hat angeschlossen! 3. Die Frage war: Ich möchte als zusatz aufgabe dazu das ich einen subprint der einen PWM signal ausgibt, auch den LCD display Programmieren. Das problem ist. Das ich jetzt an PORT B (wo der LCD Angeschlossen ist) den PB3 (wo ein PWM signal als ausgang benutzt wird) den LCD in 8-bit Modus nicht möglich! Ich kann den PB3 nicht frei machen weil der ja hardwäre technisch mit den Subprint verbunden ist! Ich habe Die LCD library der für einen LCD der in 8-bit Modus betrieben wird! Ich wollte dieses programm jetzt umschreiben aber ich bekomm das nicht hin. 4. Können jetzt bitte alle die sich über den File format erstmal keine kommentare mehr abgeben weil Ich nur eine Lösung haben will! sorry Rage post ist jetzt vorbei. Ich wäre jetzt sehr dankebar wenn mir jetzt jemand hilfreich sein kann... mit freundlichen grüßen, Marius
Hier ist zusätzlich noch der Platinen layout von der HAUPTPLATINE. wenn das auch noch einbischen aufklären kann genau was ich meine. gruß, Marius
Hallo Marius, ich verwende gerne die Implementierung von Peter Dannegger (peda). http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip http://www.avrfreaks.net/forum/tutc-lcd-tutorial-1001?name=PNphpBB2&file=viewtopic&t=102296 Beitrag "Re: LCD Sourcefile testen und dann hochladen"
:
Bearbeitet durch User
Hallo Uwe, vielen Danke für die links und download. Ich versuch jetzt mal damit was zu laufen zu bringen. Ich melde nochmal falls noch fragen da sind. Vielen Danke Nochmal!! mit Freundlichen Grüßen, Marius
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.