Probleme mit C, LCD

Guckuck

Neues Mitglied
25. Jan. 2011
5
0
0
Sprachen
hallo,
ich weiß nich,wo ich das hinposten sollte,deswegen tat ichs hier rein
ich bin neu hier un wollte gerne meinen code hier reinstellen, der aber leider nich so ganz funktioniert.
dieser soll auf dem LCD-Display die Uhrzeit zählen,leider zeigt dieser nur einen strich an:(

könnt ihr mir bitte da weiterhelfen,ich wäre sehr dankbar;)

ich habe einen atmel avr atmega 8 mit den dazugehörigen display




EDIT von Cassio: C-Code in den Beitrag eingefügt! ;)


CodeBox c

//-------------------------------------------------------------------------
// Funktion : Augabe der aktuellen Zeit über UART und LCD
//-------------------------------------------------------------------------
// Prozessor : ATmega8
// Takt : 3686400 Hz
// Sprache : C++
// Datum : 8.02.2011
// Programmer: mySmartUSB
//-------------------------------------------------------------------------
//
#define F_CPU 3686400
#include <avr\io.h>
#include <avr\interrupt.h>
#include <util\delay.h>
#include <stdio.h>
#include <string.h>



void lcd_send(char data)
{
char rs=PORTD;
rs&=4;
char tmp=data;
tmp&=0xf0;
tmp|=rs;
PORTD=tmp;
PORTD |= (1<<PD3);
PORTD &= ~(1<<PD3);
tmp=data;
tmp&=0x0f;
tmp*=16;
tmp|=rs;
PORTD=tmp;
PORTD |= (1<<PD3);
PORTD &= ~(1<<PD3);
_delay_ms(1);
}

void lcd_cmd(char cmd)
{
PORTD &= ~(1<<PD2);
lcd_send(cmd);
}


void lcd_write(char text)
{
PORTD |= (1<<PD2);
lcd_send(text);
}

void lcd_writez(char*pText)
{
while(pText[0]==0)
{
lcd_write(pText[0]);
pText++;
}
}

void lcd_home()
{
lcd_cmd(0x02);
_delay_ms(2);
}

void lcd_clear()
{
lcd_cmd(0x01);
_delay_ms(2);
}

void lcd_on()
{
lcd_cmd(0x0E);
}

void lcd_off()
{
lcd_cmd(0x08);
}

void lcd_goto(int row, int col)
{
row--;
row&=0x01;
row*=0x40;
col--;
col&=0x0f;
char tmp=row|col;
tmp|=0x80;
lcd_cmd(tmp);
}



void lcd_init()
{

DDRD=0xff;
PORTD=0;
_delay_ms(50);
PORTD = 0x30;
PORTD |= (1<<PD3);
PORTD &= ~(1<<PD3);
_delay_ms(5);
PORTD = 0x30;
PORTD |= (1<<PD3);
PORTD &= ~(1<<PD3);
_delay_us(100);
PORTD = 0x30;
PORTD |= (1<<PD3);
PORTD &= ~(1<<PD3);
_delay_ms(5);

PORTD=0x20;
PORTD |= (1<<PD3);
PORTD &= ~(1<<PD3);
_delay_ms(5);


lcd_cmd(0x28);
lcd_cmd(0x06);
lcd_on();
lcd_clear();
}


int sekunden_count;
int minuten_count;
int stunden_count;

char str1[5];
char str2[5];
char str3[5];



int main (void)
{


_delay_ms(200);
lcd_init();
sekunden_count=0;
minuten_count=0;
stunden_count=0;


while(1) //Endlose Schleife
{
_delay_ms(1000); //Funtion warten 1 Sekunde
sekunden_count++; //Sekunden Zuwachs um 1 s
}
if(sekunden_count == 60) //Wenn 1 Minute
{
sekunden_count = 0; //Sekunden auf Null
minuten_count++; //Minuten Zuwachs
if(minuten_count==60) //Wenn 1 Stunde
{
minuten_count =0; //Minuten auf Null
stunden_count++;
if(stunden_count>23) // Um Mitternacht die Uhr soll 0:00
{
stunden_count =0; //Stunden Zahler auf Null
}
}
sprintf(str1, "%d", sekunden_count);
sprintf(str2, "%d", minuten_count);
sprintf(str3, "%d", stunden_count);
lcd_writez(str3);
lcd_writez(str2);
lcd_writez(str1);
_delay_ms(100);
}





return 0;



}

 

Anhänge

  • LCD_Test.c
    2,8 KB · Aufrufe: 5
Hallo und willkommen in unserem Forum.

Ich habe deinen Beitrag verschoben und daraus ein neues Thema erzeugt, so wird der Beitrag besser gefunden und dir kann besser geholfen werden.

Ich habe deinen Code überflogen, ich vermute die LCD-Funktionen hast du aus einem anderem Beispiel übernommen, der sollte dann soweit fehlerfrei sein. Das LCD ist auch richtig angeschlossen?!

In main() initialisierst du das LCD, und deine Zeit-Variablen, danach kommt eine while(1)-Schleife, in der du hängen bleibst, es erfolgt keine Ausgabe auf dem LCD.

Noch ein Hinweis: Du versuchst einen Sekundentakt mittels _delay_ms(1000) zu erzeugen. Das eignet sich nicht für eine "Uhr", zumal noch weitere Delays in deinem Programmcode vorkommen. Ich würde hier wenigstens einen Timer verwenden (Stichpunkt CTC-Mode) der ein Sekundensignal erzeugt.

Also erst einmal den Punkt mit der while(1)-Schleife korrigieren.

Vielleicht hilft dir das schon mal weiter.

Grüße,
Dirk
 
Hallo Guckuck !

Willkommen im AVR-PRaxis Forum! :ciao:

Ich habe den Programmcode mal direkt in deinen Beitrag eingefügt!
So können wir alles besser sehen, worüber geschrieben wird. ;)

Außerdem kann so jeder mal den Code schnell durchsehen und vielleicht einen Hinweis geben.


Grüße,
Cassio
 
ich weiß nicht wie ein Timer funktionieren soll und den code habe ich selbstgeschrieben mit hilfe von anderen, also ich weiß ehrlich nich weiter un weiß nicht wie ich da eine uhrzeit realisieren soll.:(
 
Hallo,

in deinem C-Code erfolgt keine LCD-Ausgabe, folglich erscheint auch nichts auf dem LCD. Wie ich bereits geschrieben habe, liegt es daran, dass du in main() nach den Initialisierungen in der while(1)-Schleife hängst.

Ob die Initialsisierung für das Display stimmt, die Datenübertragung stimmt oder der Anschluss des LCD an dem Mikrocontroller stimmt, können wir leider nicht überprüfen, da wir Display und Schaltplan nicht kennen.

Ich würde vor der While(1)-Schleife erst einmal eine einfache Displayausgabe machen, um zu prüfen, ob der Fehler schon in der Initialisierung oder dem Interface zum LCD liegt.

Dirk
 
hallo

jetzt klaptts schon besser,das display zeigt die uhrzeit usw an,also der zählt.
nur wenn dieser nach 60 sek auf minute 1 schaltet,zählt die sekunden wieder von null
schön soweit
allerdings danach nach 11 sek geht die minute "1" wieder auf null.

hier mein code

danke für hilfe



EDIT Cassio: Programmcode zur einfacheren Ansicht direkt eingestellt!
(Stell doch bitte den Code immer direkt ein und verlange nicht von den Helfenden, dass sie diesen auch noch etxtra runterladen müssen!)


CodeBox c

//-------------------------------------------------------------------------
// Funktion : Augabe der aktuellen Zeit über UART und LCD
//-------------------------------------------------------------------------
// Prozessor : ATmega8
// Takt : 3686400 Hz
// Sprache : C++
// Datum : 8.02.2011
// Programmer: mySmartUSB
//-------------------------------------------------------------------------
//
#define F_CPU 3686400
#include <avr\io.h>
#include <avr\interrupt.h>
#include <util\delay.h>
#include <stdio.h>
#include <string.h>
//#define ZEAHL F_CPU/(64*256) //interruptzähler



void lcd_send (char data)
{
//aktuelles RS ermitteln
char rs=PORTD;
rs&=4;
//High-Teil senden
char tmp=data;
tmp&=0xf0;
tmp|=rs;
PORTD=tmp;
// Schreibsignal
PORTD |= (1<<PD3);
PORTD &= ~(1<<PD3);
//Low teil senden
tmp=data;
tmp&=0x0f;
tmp*=16;
tmp|=rs;
PORTD=tmp;
//schreibsignal
PORTD |= (1<<PD3);
PORTD &= ~(1<<PD3);
//verarbeiten lassen
_delay_ms(1);
}

void coursor_delete()
{



}

void lcd_cmd(char cmd)
{

PORTD &= ~(1<<PD2);
lcd_send(cmd);

}

void lcd_clear()
{

lcd_cmd(0x01);
_delay_ms(2);

}

void lcd_home()
{

lcd_cmd(0x02);
_delay_ms(2);

}

void lcd_on()
{

lcd_cmd(0x0E);

}

void lcd_off()
{

lcd_cmd(0x08);

}

void lcd_goto(int row,int col)
{
row--;
row&=0x01;
row*=64;
col--;
col&=0x0f;
char tmp=row|col;
tmp|=0x80;
lcd_cmd(tmp);
}


void lcd_init()
{

DDRD=0x0ff;
PORTD=0;
_delay_ms(50);
//1
PORTD=0x30;
PORTD |= (1<<PD3);
PORTD &= ~(1<<PD3);
_delay_ms(5);
//1
PORTD=0x30;
PORTD |= (1<<PD3);
PORTD &= ~(1<<PD3);
for(int i=0;i<100;i++)
//1
PORTD=0x30;
PORTD |= (1<<PD3);
PORTD &= ~(1<<PD3);
_delay_ms(5);
//4-BitModus einschalten
PORTD=0x20;
PORTD |= (1<<PD3);
PORTD &= ~(1<<PD3);
_delay_ms(5);
lcd_cmd(0x28);
lcd_off();
lcd_clear();
lcd_cmd(0x06);
lcd_on();
}



void lcd_write(char text)
{

PORTD |= (1<<PD2);
lcd_send(text);

}

void lcd_writez(char* pText)
{

while(pText [0] != 0)
{

lcd_write(pText[0]);
pText++;


}

}

int sekunden_count;
int minuten_count;
int stunden_count;

char str1[10];



int main (void)
{


_delay_ms(200);
lcd_init();



while(2) //Endlose Schleife
{
_delay_ms(1000); //Funtion warten 1 Sekunde
sekunden_count++; //Sekunden Zuwachs um 1 s
if(sekunden_count == 60) //Wenn 1 Minute
{
sekunden_count = 0; //Sekunden auf Null
minuten_count++; //Minuten Zuwachs
if(minuten_count==60) //Wenn 1 Stunde
{
minuten_count =0; //Minuten auf Null
stunden_count++;
if(stunden_count>23) // Um Mitternacht die Uhr soll 0:00
{
stunden_count =0; //Stunden Zahler auf Null
}
}
}
lcd_clear();
sprintf(str1, "%d : %d : %d", stunden_count, minuten_count, sekunden_count);
lcd_writez("Zeit");
lcd_writez(str1);
_delay_ms(100);
}










return 0;



}

 

Anhänge

  • LCD_Test.c
    2,9 KB · Aufrufe: 7
Sieht eigentlich gut aus, auf den ersten Blick kann ich nichts schlimmes sehen.

Ich würde die 3 Zählervariablen allerdings anfangs alle auf 0 setzen.
Das delay ganz unten kannst Du Dir sparen, da Du danach eh wieder 1s wartest.

Michael
 
Hallo Michael,
Das delay ganz unten kannst Du Dir sparen, da Du danach eh wieder 1s wartest.

das delay sollte sogar entfernt werden, da durch das 100ms-delay alle 10 Sekunden ein Fehler von 1 Sekunde ensteht :) Das delay(1000) eignet sich als Zeitbasis für eine Uhr eigentlich nicht so, eher nur zum Testen der Uhrfunktion.

Grüße,
Dirk
 
dankeschön,meine uhr funktioniert, ich musste das array bei char auf 60 erhöhen.
nun eine weitere frage

ich versuch als meinen summer zum piepen zu bringen,aber es funktioniert nich,ich denk ma ich mach was falsch,ich setz den pin,wo ich das verbunden habe auf 1.
der summer soll bei einer gewissen zeit piepen.

danke schonma für hilfe

das delay ganz unten hab ich weggelassen,sonst gibts eine verzögerung.
 
ich versuch als meinen summer zum piepen zu bringen,aber es funktioniert nich,ich denk ma ich mach was falsch,ich setz den pin,wo ich das verbunden habe auf 1.
der summer soll bei einer gewissen zeit piepen.
Evtl. ist dies ein Summer, der mit einer Frequenz angesteuert werden will. Wenn du bei einem Lautsprecher nur eine positive Spannung drauflegst, kommt da auch kein Ton raus. Dafür müsstest du andauernd ein und ausschalten.
Bei meinen Piepsern habe ich einen Timer im CTC Modus dazu verwendet, den Ton zu erzeugen, damit dies vollkommen unabhängig von der Ausführung des Programms passiert. Du kannst aber auch den Sound Befehl nehmen, zumindest zum Testen, ob dann was kommt. Dein Programm bleibt aber bei dem Befehl stehen bis er durchgelaufen ist.

HBA
 
Du kannst aber auch den Sound Befehl nehmen.....


Hallo HBA!

Öhm.... der Guckuck schreibt aber in C und nicht in BASCOM. ;)
Oder gibt es in C jetzt auch einen fertigen SOUND-Befehl? :eek:


Er wird ggf. wohl nicht um das Erzeugen eines Taktsignals mit ein paar Kilohertz drumherum kommen.

Grüße.
Cassio
 
Hmm, das kommt, wenn man sich nicht die Zeit nimmt, den Rest durchzulesen :D
Den CTC Timer kann er aber trotzdem verwenden.

HBA
 
Hallo zusammen,
Den CTC Timer kann er aber trotzdem verwenden.

so mache ich es auch immer, dann macht das alles die Hardware vom Timermodul.

Zum Testen geht mal folgendes:
(PA0 entsprechend anpassen und vorher als Ausgang schalten, 4kHz, 250ms lang)
Code:
void Beep(void)
{
  uint16_t i;

  i = 1000;

  do
  {

    PORTA |= (1<<PA0);
    _delay_us(125);

    PORTA &= ~(1<<PA0);
    _delay_us(125);

    i--;
  } while(i);
}
Dirk
 
also ein ton kommt raus, nur der is extrem leise un nur ein kleines piepen.
der muss lauter un etwas länger werden, aber ich hab kein ahnung wie.:D
 
Das Piezoelement hat eventuell eine andere Grundfrequenz als 4kHz oder es benötigt eine höhere Betriebsspannung. Verwende auch mal einen Widerstand parallel zum Piezoelement, verwende zum Beispiel 10k Ohm. Schau dir auch mal das Datenblatt an.

Dirk
 
LCD Uhr - Tonerzeugung

Hallo !

Du könntest doch mit Hilfe eines Ports einen sogenannten Start/Stop-Oszillator starten, der Dir dann ein Rechtecksignal erzeugt.

Vorteil:
Einfach umzusetzen - Softwareänderung überschaubar
Die Aktivierung könnte so aussehen:
Pegeländerung eines Portausgangs -> Start/Stop-Oszillator starten -> Verstärker (falls nötig) -> Lautsprecher

Die Freuquenz des Start/Stop-Oszillators kannst Du selber bestimmen,
die Lautstärke ebenfalls - über einen einfachen Verstärker möglich
(Schaltung und Dimensionierng auf Anfrage - habe leider wenig Zeit)

Nachteil:
Zusätzliche Hardware (Start/Stopp-Oszillator) nötig
Ggf. ist noch ein Verstärker (Emitter-Grundschaltung) nötig
Lautsprecher (z.B. 8Ohm)


Tip:
Schau Dir mal die Seite von Scott-Falk Hühn an, dort sind ähnliche Lösungen zu sehen...


Muss jetzt weiter arbeiten....


MfG

FreeVEE
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)