- Akku Tests und Balkonkraftwerk Speicher         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 28 von 28

Thema: atmega16 Füllstand

  1. #21
    Benutzer Stammmitglied
    Registriert seit
    20.03.2010
    Beiträge
    50
    Anzeige

    Powerstation Test
    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

  2. #22
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.082
    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

  3. #23
    Benutzer Stammmitglied
    Registriert seit
    20.03.2010
    Beiträge
    50
    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

  4. #24
    Benutzer Stammmitglied
    Registriert seit
    20.03.2010
    Beiträge
    50
    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önntest Zunächst wäre ich froh es wuerde wenigstens leuchten

    Vielen Dank,

    Jimmy

  5. #25
    Benutzer Stammmitglied
    Registriert seit
    20.03.2010
    Beiträge
    50
    Hab auch schon versucht die datei lcd-routines.c als lcd-routines2.h einzubinden. Aber das LCD leuchtet nicht einmal!?
    MFG

  6. #26
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.082
    Habe gerade im DB nachgeschaut. Dort steht auf S119 unter "Output Compare Unit":
    The 8-bit comparator continuously compares TCNT2 with the Output Compare Register
    (OCR2). Whenever TCNT2 equals OCR2, the comparator signals a match.
    Das heißt soviel wie er zählt solange bis er den Wert erreicht (nicht ab diesen Wert).
    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

  7. #27
    Benutzer Stammmitglied
    Registriert seit
    20.03.2010
    Beiträge
    50
    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

  8. #28
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.082
    Mit UART habe ich mich noch nicht beschäftigt. Ich glaube, dass im Artikelbereich ein Beitrag über die Ansteuerung des UART gibt. Am PC brauchst du ein Terminalprogramm.

    Mfg Hannes

Seite 3 von 3 ErsteErste 123

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen