Das ! musst du schreiben, es fehlt aber in deinem Programm. Wie kommst du auf 125 Überläufe/s?
Der Wert im OCR wird immer geändert. du musst den immer neu einstellen, nicht nur einmal.
MfG Hannes
Hallo Hannes,
also ich hab die internen Pullup Widerstände verwendet. Deshalb brauch ich ja das ! wegen dem Invertieren. Ich dacht mir ich lass den Timer hochzählen und die ISR gibt mir ja dann die Anzahl der Überläufe an und lässt die Variablen entsprechend hochzählen. (sekunde, minute, stunde) Muss ich denn da noch rückrechnen? Habs ja so eingestellt, dass alle 125 Überläufe eine sekunde vergangen ist.
Viele Grüße,
Jimmy
Das ! musst du schreiben, es fehlt aber in deinem Programm. Wie kommst du auf 125 Überläufe/s?
Der Wert im OCR wird immer geändert. du musst den immer neu einstellen, nicht nur einmal.
MfG Hannes
Hey Hannes,
ich dachte mit dem Prescaler und dem OCR-Wert bestimme ich wie oft in der Sekunde eine ISR ausgeführt wird!? TCNT bestimmt ab wo gezählt wird und so ergibt sich bei den eingestellten Werten eine "Frequenz" für die ISR von 125Hz. Deshalb zählt man doch Sekunde immer hoch wenn z == 125 usw...oder bin ich jetzt völlig falsch
MFG Jimmy
Hallo Hannes,
ich hab mal versucht ein LCD einfach an meinen uC anzuschliessen. Ist ein Seiko LCD-Display 16X2 (L1672 series). Hat natuerlich nicht funktioniert
Hierrueber hab ich Port B fuer mein LCD benutzt und diese Datei als Header-Datei in mein Programm eingebunden
void lcd_data(unsigned char temp1);
void lcd_string(char *data);
void lcd_command(unsigned char temp1);
void lcd_enable(void);
void lcd_init(void);
void lcd_home(void);
void lcd_clear(void);
void set_cursor(uint8_t x, uint8_t y);
// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!
#define F_CPU 8000000
// LCD Befehle
#define CLEAR_DISPLAY 0x01
#define CURSOR_HOME 0x02
// Pinbelegung für das LCD, an verwendete Pins anpassen
#define LCD_PORT PORTB
#define LCD_DDR DDRB
#define LCD_RS PDB
#define LCD_EN PDB
// DB4 bis DB7 des LCD sind mit PB0 bis PB3 des AVR verbunden
.
Mein Controller is der KS0066 also muesste das doch laut Tutorial funktionieren wenn ich das Programm einbinde. Pins sind entsprechend verbunden...
Das Programm hab ich einfach kopiert...aber nichts passiert!?
#include <avr/io.h>
#include "lcd-routines.h"
int main(void)
{
lcd_init();
lcd_data('T');
lcd_data('e');
lcd_data('s');
lcd_data('t');
set_cursor(0,2);
lcd_string("Hello World!");
while(1)
{
}
return 0;
}
Wie gehe ich mit der lcd-routines.c denn um ?? Wird die auch einfach eingebunden ? So hab ichs nämlich versucht...(Source-Files reinkopiert) Oder was mache ich mit der ?
// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// http://www.mikrocontroller.net/artic...CD-Ansteuerung
//
// Die Pinbelegung ist über defines in lcd-routines.h einstellbar
#include <avr/io.h>
#include "lcd-routines.h"
#include <util/delay.h>
// sendet ein Datenbyte an das LCD
void lcd_data(unsigned char temp1)
{
unsigned char temp2 = temp1;
LCD_PORT |= (1<<LCD_RS); // RS auf 1 setzen
temp1 = temp1 >> 4;
temp1 = temp1 & 0x0F;
LCD_PORT &= 0xF0;
LCD_PORT |= temp1; // setzen
lcd_enable();
temp2 = temp2 & 0x0F;
LCD_PORT &= 0xF0;
LCD_PORT |= temp2; // setzen
lcd_enable();
_delay_us(42);
}
// sendet einen Befehl an das LCD
void lcd_command(unsigned char temp1)
{
unsigned char temp2 = temp1;
LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 setzen
temp1 = temp1 >> 4; // oberes Nibble holen
temp1 = temp1 & 0x0F; // maskieren
LCD_PORT &= 0xF0;
LCD_PORT |= temp1; // setzen
lcd_enable();
temp2 = temp2 & 0x0F; // unteres Nibble holen und maskieren
LCD_PORT &= 0xF0;
LCD_PORT |= temp2; // setzen
lcd_enable();
_delay_us(42);
}
// erzeugt den Enable-Puls
void lcd_enable(void)
{
// Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers einfügen
// http://www.mikrocontroller.net/topic/81974#685882
LCD_PORT |= (1<<LCD_EN);
_delay_us(1); // kurze Pause
// Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers verlängern
// http://www.mikrocontroller.net/topic/80900
LCD_PORT &= ~(1<<LCD_EN);
}
// Initialisierung:
// Muss ganz am Anfang des Programms aufgerufen werden.
void lcd_init(void)
{
LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN); // Port auf Ausgang schalten
// muss 3mal hintereinander gesendet werden zur Initialisierung
_delay_ms(15);
LCD_PORT &= 0xF0;
LCD_PORT |= 0x03;
LCD_PORT &= ~(1<<LCD_RS); // RS auf 0
lcd_enable();
_delay_ms(5);
lcd_enable();
_delay_ms(1);
lcd_enable();
_delay_ms(1);
// 4 Bit Modus aktivieren
LCD_PORT &= 0xF0;
LCD_PORT |= 0x02;
lcd_enable();
_delay_ms(1);
// 4Bit / 2 Zeilen / 5x7
lcd_command(0x2;
// Display ein / Cursor aus / kein Blinken
lcd_command(0x0C);
// inkrement / kein Scrollen
lcd_command(0x06);
lcd_clear();
}
// Sendet den Befehl zur Löschung des Displays
void lcd_clear(void)
{
lcd_command(CLEAR_DISPLAY);
_delay_ms(5);
}
// Sendet den Befehl: Cursor Home
void lcd_home(void)
{
lcd_command(CURSOR_HOME);
_delay_ms(5);
}
// setzt den Cursor in Zeile y (1..4) Spalte x (0..15)
void set_cursor(uint8_t x, uint8_t y)
{
uint8_t tmp;
switch (y) {
case 1: tmp=0x80+0x00+x; break; // 1. Zeile
case 2: tmp=0x80+0x40+x; break; // 2. Zeile
case 3: tmp=0x80+0x10+x; break; // 3. Zeile
case 4: tmp=0x80+0x50+x; break; // 4. Zeile
default: return; // für den Fall einer falschen Zeile
}
lcd_command(tmp);
}
// Schreibt einen String auf das LCD
void lcd_string(char *data)
{
while(*data) {
lcd_data(*data);
data++;
}
}
Wäre toll wenn du mir helfen könntestZunächst wäre ich froh es wuerde wenigstens leuchten
Vielen Dank,
Jimmy
Hab auch schon versucht die datei lcd-routines.c als lcd-routines2.h einzubinden. Aber das LCD leuchtet nicht einmal!?
MFG
Habe gerade im DB nachgeschaut. Dort steht auf S119 unter "Output Compare Unit":
Das heißt soviel wie er zählt solange bis er den Wert erreicht (nicht ab diesen Wert).The 8-bit comparator continuously compares TCNT2 with the Output Compare Register
(OCR2). Whenever TCNT2 equals OCR2, the comparator signals a match.
Wie das mit dem LCD funktioniert weiß ich nicht, hab noch nicht mit LCDs gearbeitet. Du musst vermutlich die Makefile anpassen. Hier findest du einen Link zur AVRLIB. Bei der kannst du schauen, wie das geht. Du musst die *.c und die *.h Datei einbinden.
Das ist aber nur eine Vermutung.
MfG Hannes
Hallo Hannes,
das mit dem LCD kann ich vergessen, da es sowieso hinüber ist
Habs erst vorhin entdeckt. Weisst du zufällig wie die Ausgabe über UART funktioniert ? Brauch ich da auf dem Rechner ein Programm oder gibt der mir das bei ner Verbindung mit meinem STK die Variable direkt aus?
/* UART-Init Bsp. ATmega16 */
void uart_init(void)
{
UCSRB |= (1<<TXEN); // UART TX einschalten
UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
}
Ausgabe dann so:
// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.B. fuer ATmega16:
while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
{
}
UDR = 'x'; /* schreibt das Zeichen x auf die Schnittstelle */
Reicht das schon !? Um mir ne Variable am Rechner auszugeben ?
Oder brauch ich da sonst noch was ?
MFG
Lesezeichen