PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger braucht Hilfe um LED's zu programmieren.



rob_88_20p
20.06.2009, 22:59
Hi @ all

Wie schon oben geschrieben, binn ich totaler Anfänger und brauche Hilfe um mehrere LED's zu programmieren.

Dies soll folgender massen geschehen:

Schalter wird betätigt -> LED1 leuchtet auf und bleibt so.
Schalter wird nochmals betätigt -> LED1 geht aus -> LED2 leuchtet auf und bleibt so.
Schalter wird nochmals betätigt -> LED2 geht aus und bleibt so.
Schalter wird nochmals betätigt -> LED1 leuchtet wieder auf, der Prozess beginnt von vorne.

und der zweite Code soll dies tun.

Schalter wird betätigt -> LED1 leuchtet auf und bleibt so.
Schalter wird nochmals betätigt -> LED2 leuchtet auf und bleibt so.
Schalter wird nochmals betätigt -> LED2 geht aus und bleibt so.
Schalter wird nochmals betätigt -> LED1 leuchtet auf , der Prozess beginnt von vorne.

Ich weiss das klinkt für Euch vielleicht einfach, aber ich habe Probleme damit.

Kann mir Jemand vielleicht einen Codeschnipsel geben, den ich dann leicht erweitern/verändern kann z.B. statt des Schalters einen Sensor und/oder mehr LED's.

Programmiert wird in C und mit AVRStudio, ich arbeite mit folgenden uC's

ATmega88 20PU, ATmega16 16PU, ATtiny2313 20PU, ATtiny13v 10PU.

Am bessten wäre, wenn es ein nicht so komplizierter Code wäre, damit ich ihn leicht umschreiben kann z.B. Das ich noch eine verzögerung in den Prozess einbauen kann.

Wäre echt toll wenn mir Jemand helfen könnte.

Danke :-) :-)

Lync
21.06.2009, 09:24
Hallo

Du kannst in einer if clause abfragen ob der taster gedrückt.
Dann wird eine Variable auf einen bestimmten Wert gesetzt.
Dieser Wert verweißt in der if clause auf das blinken einer LED oder was auch imemr.
Dann hast du noch bei der Tasterabfrage eine weitere Variable die die Port"nummer" enthält (0,1,2,3,4,5,6,7) (die wird auch immer beim Tasterdruck hochgezählt)
Und du schaltest dann eben in der 2.if clause die entsprechende LED.

der 2. code ist im prinzip fast das gleiche.

mfg

hoffe das konnte bisl helfen

McJenso
21.06.2009, 11:17
Hallo,

kurz zur Ergänzung, je nach Taster/Sensor muss eventuell eine Entprellung stattfinden.

Gruß

Jens

rob_88_20p
21.06.2009, 16:12
Danke für deine Antwort, aber ich habe keine ahnung wie ich den Code schreiben muss, wie gesagt ich bin totaler Anfänger.

Kannst du mir vielleicht einen Codeschnipsel schreiben ?

Wäre echt super.

lg rob_88_20p

P.S. Ich hätte da noch eine zweite Frage:

Ich habe vor kurzem eine kleine Zahlentastatur gelötet, um damit ein Codeschloss zu bauen. Aber ich habe schwierigkeiten mit der Programmierung:

Der Code soll in etwa das tun:

In Register1 wurde z.b. der Code 1,4,3,7 festgelegt.

Nun werden Tasten gedrückt und für sagen wir, 10 sekunden in Register2 gespeichert.

Taste 1 wird gedrückt, die 1 wird in Register2 gespeichert.
Taste 4 wird gedrückt, die 4 wird auch in Register2 gespeichert.
Taste 3 wird gedrückt, die 3 wird auch in Register2 gespeichert.
Taste 7 wird gedrückt, die 7 wird auch in Register2 gespeichert.

Nun wird Register1 mit Register2 verglichen.

(sehr vereinfacht)

if Register1 = Register2 , Dann z.B. Relais1 ON
if Register1 ~ Register2 , Dann z.B. Alarm1 ON

Aber ich habe keine ahnung wie ich in ein Register schreiben, geschweige denn eines erstellen oder zwei mit einander vergleichen kann.

Ich hoffe Du kanst mir nochmal weiterhelfen.

Hubert.G
21.06.2009, 19:31
www.rn-wissen.de/index.php/C-Tutorial
www.rn-wissen.de/index.php/Avr-gcc
www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Du solltest mit einfachen Dingen anfangen. Schau dir die Tutorials an, da steht alles drinnen was du dafür brauchst.

frechdachs040774
15.12.2013, 10:04
Einen schönen Guten Morgen.
Ich bin ein Anfänger was das Programmieren an geht und habe mir zum probieren und Lernen den Atmega 16-16PU ein Steckbrett, den Diamex All-AVR Programmer zugelegt.
Die Software ist das Atmel Studio 6.0

Ich habe ein problem mit einem Atmega 16-16PU.

Ein kleines Programm habe ich auch schon geschrieben und damit eine LED Angesteuert.

/*
* GccApplication2.c
*
* Created: 14.12.2013 20:11:52
* Author: Jens Grumme
*/

#define F_CPU 16000000UL
#include <avr/io.h>

int main(void)
{
DDRA=0b01100001;
while(1)
{
PORTA=0b01000000;

Ich suche nach dem befehl das die LED Blinken soll.

Habe nach langem probieren den befehl
_delay_ms() gefunden in die Klammern habe ich 200 rein geschrieben für 200ms.

Aber nach dem Build Solution bekomme ich diesen Fehler angezeigt.
Error 2 undefined reference to `_delay_ms'

Kann mir da jemand tip geben.

Wünsche noch ein schönen 3 Advent.

BMS
15.12.2013, 10:28
Hallo,
es fehlt wohl das entsprechende include, also

#include <util/delay.h>
Grüße,
Bernhard

PS: Damit man deinen Code besser lesen kann, kannst du ihn hier im Forum zwischen [CODE ] und [/CODE ] (ohne Leerzeichen) einfügen ;)

frechdachs040774
15.12.2013, 12:41
Danke es hat geklappt.

Recht vielen Dank noch mal.

Eine Frage hätte ich noch, kann man mit dem atmega 16-16PU eine LED Uhr bauen bzw programmieren.

BMS
15.12.2013, 14:12
Eine Frage hätte ich noch, kann man mit dem atmega 16-16PU eine LED Uhr bauen bzw programmieren.
Das ist auf jeden Fall machbar. Dafür verwendet man Siebensegmentanzeigen, die man dann meist mit sog. Multiplexing betreibt.

frechdachs040774
15.12.2013, 19:31
Guten abend, ich habe eine frage.

Ich habe bei mir noch ein LCD Modul vom Typ msc-c204dyly-1n gefunden.

Frage wie Steuer ich das mit einem Atmega 16-16 an bzw kann ich es überhaubt ansteuern.

Grund der frage ist ich habe mir ein kleines projekt mit dem modul aus gedacht.

Hubert.G
16.12.2013, 09:52
Das ist ein Standard-LCD mit einem KS0076 Kontroller, HD44780 kompatibel. Dafür gibt es fertige Librarys. Suche mal nach Peter Fleury.

frechdachs040774
22.12.2013, 16:40
Guten abend, ich beschäftige mich jetzt seit gut einer woche mit dem Programmieren von microcontrollern. Habe mir bei reichelt ein paar verschieden modelle bestellt. Unter anderem den atmega 16-16, atmega 32 und atmega 644.
Dazu noch ein paar Segmentanzeigen und auch ein LCD Modul typ AV2040.

Lauflicht mit 8 LED´s bekomme ich schon hin.

Nur bekomme ich es nicht hin das LCD modul an zusteuern, habe schon einige programme ausprobiert die es so im netz und auf youtube gibt.
Aber keines von den hat wirklich funktioniert muss dazu sagen in den beispielen war auch meist nur ein LCD Moduul mit nur zwei Zeilen zu sehn.

Es gibt leider wehnig beispiele für die oben genannten controllern.

Meine frage ist kann ich das LCD Modul überhaubt mit den oben genannten controllern ansteuern.

Zweite frage ich finde den Herrn Peter Fleury nicht.

Wünsche noch ein schönen 4 Advent.

- - - Aktualisiert - - -

Vieleicht kann mir ja jemand mal ein Code zur verfügung stellen der komplett ist und auch läuft damit ich mich mit dem Modul beschäftigen kann.

Benutze zum programmieren Atmel Studio 6.

Hubert.G
22.12.2013, 16:43
Hier der Link zu Fleury: http://homepage.hispeed.ch/peterfleury/
Das LCD-Modul kenne ich nicht, finde ich auch nicht bei Reichelt.

frechdachs040774
25.12.2013, 16:30
Hallo Hubert, das LCD Modul ist on Conrad.

Habe die tage noch mal rum gefummelt und auch so weit es hin bekommen das ich text auf das Display bekomme.

Jetzt habe ich im netz ein code gefunden für eine Uhr.

Geschrieben zwar für ein Atmega16 aber in der erkärung standauch das man ein Atmega 32 benutzen kann.

Dacht ich mir alles wunderbar den code auf den controller geschrieben und alles zusammen gesteckt wie es im plan stand aber die anzeige bleibt stumm.
In der erkärung steht noch folgendes:

Important Note: In order for the LCD Marquee unit to work correctly the internal oscillator of the ATMega16 AVR microcontroller must be enabled and set to 4MHz.

Ich füge am besten hier mal den quellcode ein. ieleicht ist dort ja auch noch ein fehler drin den ich nicht sehe.

#define F_CPU 4000000UL
#include <avr/delay.h>
#include <avr/io.h>

/*LCD function declarations */
void LCD_send_command(unsigned char cmnd);
void LCD_send_data(unsigned char data);
void LCD_init();
void LCD_goto(unsigned char y, unsigned char x);
void LCD_print(char *string);
void LCD_blink();
void LCD_scroll(unsigned char direction);

#define LCD_DATA_PORT PORTB
#define LCD_DATA_DDR DDRB
#define LCD_DATA_PIN PINB

#define LCD_CNTRL_PORT PORTC
#define LCD_CNTRL_DDR DDRC
#define LCD_CNTRL_PIN PINC

#define LCD_RS_PIN 0
#define LCD_RW_PIN 1
#define LCD_ENABLE_PIN 2

int main(void)
{
unsigned char i;

LCD_init();
LCD_goto(1,2);
LCD_print("AVR TUTORIALS");
LCD_goto(2,3);
LCD_print("WELCOMES YOU");

while(1)
{
for(i=0;i<2;i++)
LCD_blink();

for(i=0;i<2;i++)
LCD_scroll(0);

for(i=0;i<4;i++)
LCD_scroll(1);

for(i=0;i<2;i++)
LCD_scroll(0);
}
}

/* This function sends a command 'cmnd' to the LCD module*/
void LCD_send_command(unsigned char cmnd)
{
LCD_DATA_PORT = cmnd;
LCD_CNTRL_PORT &= ~(1<<LCD_RW_PIN);
LCD_CNTRL_PORT &= ~(1<<LCD_RS_PIN);

LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
_delay_us(2);
LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
_delay_us(100);
}

/* This function sends the data 'data' to the LCD module*/
void LCD_send_data(unsigned char data)
{
LCD_DATA_PORT = data;
LCD_CNTRL_PORT &= ~(1<<LCD_RW_PIN);
LCD_CNTRL_PORT |= (1<<LCD_RS_PIN);

LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
_delay_us(2);
LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
_delay_us(100);
}

void LCD_init()
{
LCD_CNTRL_DDR = 0xFF;
LCD_CNTRL_PORT = 0x00;
LCD_DATA_DDR = 0xFF;
LCD_DATA_PORT = 0x00;

_delay_ms(10);
LCD_send_command(0x38);
LCD_send_command(0x0C);
LCD_send_command(0x01);
_delay_ms(10);
LCD_send_command(0x06);
}

/* This function moves the cursor the line y column x on the LCD module*/
void LCD_goto(unsigned char y, unsigned char x)
{
unsigned char firstAddress[] = {0x80,0xC0,0x94,0xD4};

LCD_send_command(firstAddress[y-1] + x-1);
_delay_ms(10);
}

void LCD_print(char *string)
{
unsigned char i;

while(string[i]!=0)
{
LCD_send_data(string[i]);
i++;
}
}

void LCD_blink()
{
LCD_send_command(0x08);
_delay_ms(250);
LCD_send_command(0x0C);
_delay_ms(250);
}

void LCD_scroll(unsigned char direction)
{
if(direction == 0)
LCD_send_command(0x18);
else
LCD_send_command(0x1C);

_delay_ms(500);
}

frechdachs040774
29.12.2013, 17:00
Hallo ihr Lieben habe es hin bekommen und meine beiden Atmega 16 Bausteine wieder zum leben erweckt, kann wieder drauf zu greifen.

Eine Frage hab eich und zwar hab eich aus einem Buch verschieden schaltungen und auch Programme.

Aber in diesem buch wird zu 90% der Atmega8 verwendet, kann ich da auch den Atmega 16 bzw 32 benutzen.
Es wird auch bei den programmen viel mit 8 Mhz gearbeitet. Aber da ich kein 8 MHZ Quarz habe, habe ganze kiste voll nur 4 MHz war jetzt die frage ich kann doch über die Fuse den internen Quarz auf 8 MHz einstellen oder?

MFG
Jens Grumme

Hubert.G
29.12.2013, 17:32
Grundsätzlich kannst du auch einen Mega16 anstelle Mega8 verwenden. Du musst nur einige Registernamen ändern.
Du kannst den internen 8MHz-Oszillator verwenden, allerdings ist dieser nicht sehr genau und schwankt auch. Es werden aber viele Programme auch mit 4MHz funktionieren.