- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 10

Thema: Hat jemand eine Idee bevor ich verzweifel?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von RolfD Beitrag anzeigen
    Bei folgendem Code.. und c=0x00;
    Code:
    #define LCD_LL 0x0f
    
    static uint8_t lcd_cpos;
    static uint8_t lcd_line;
            c=0x00;
            lcd_line = 0x00;
            lcd_cpos = (c - (lcd_line * LCD_LL));
    Kommt bei mir in lcd_cpos immer 1 raus.. obwohl es 0 sein muss.
    Ist der Compiler defekt?
    Mit Sicherheit nicht. Ein Compiler, bei dem die Integer-Multiplikation nicht funktioniert, kommt nicht durch die automatischen Regressionstests. Da braucht man nicht den Assemblercode anzuschauen. Ist Zeitverschwendung.

    Wenn ich der Compiler wäre, würde ich den ganzen gezeigten Code wegoptimieren. lcd_cpos wird zwar berechnet aber nie verwendet, also braucht es nicht berechnet zu werden. Außerdem ist alles außerhalb jeder Funktion und wird daher nie ausgeführt.

    Oder ernsthaft: zeig mehr von deinem Code, am besten auch die Zeile, in der der Fehler steckt.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    @Klebwax
    Also im Prinzip stimme ich Dir ja zu... insbesondere die Aussage zu den Regressionstests.. aber Du kannst mir schon zutrauen, das ich das nicht in der Luft freihängend teste...
    Der Code sieht zum testen grade so aus:
    Code:
    int16_t lcd_putchar(char c)
    {
        static bool nl_seen;
        static bool cursor_seen;
        uint8_t i;
    
        if (cursor_seen) { // erstes Zeichen nach \v, Cursorposition also \v%c
            //if (c <= LCD_LL) lcd_line=0;
            c=0x00;
            lcd_line=0x00;
            //else lcd_line =  c % LCD_LL; //aus kumulierter Cursorpos Zeile und Spalte berechnen
            lcd_cpos = (c - (lcd_line * LCD_LL));
            lcd_data(LCD_SET_DDADR + LCDLineAdr[lcd_line] + lcd_cpos, LCD_CMD);
    // hier steht auch noch was code, der aber nichts zur Sache tut
            cursor_seen = false; //ok es geht weiter im String
            return 1; // darf nicht zur weiteren Auswertung gelangen.
        } else { // wenn keine Cursorposition, dann normales Zeichen
    //.. blabla.. hier gehts noch weiter
    Der Code sollte eigentlich später so aus sehen:
    Code:
    int16_t lcd_putchar(char c)
    {
        static bool nl_seen;
        static bool cursor_seen;
        uint8_t i;
    
        if (cursor_seen) { // erstes Zeichen nach \v, Cursorposition also \v%c
            if (c <= LCD_LL) lcd_line=0;
            else lcd_line = c % LCD_LL; //aus kumulierter Cursorpos Zeile und Spalte berechnen
            lcd_cpos = (c - (lcd_line * LCD_LL));
            lcd_data(LCD_SET_DDADR + LCDLineAdr[lcd_line] + lcd_cpos, LCD_CMD);
    // hier steht auch noch was code, der aber nichts zur Sache tut
            cursor_seen = false; //ok es geht weiter im String
            return 1; // darf nicht zur weiteren Auswertung gelangen.
        } else { // wenn keine Cursorposition, dann normales Zeichen
    //.. blabla.. hier gehts noch weiter
    die lcd_data(LCD_SET_DDADR + LCDLineAdr[lcd_line] + lcd_cpos, LCD_CMD);
    ist definiert als void lcd_data( uint8_t data, uint8_t mode ); , LCDLineAdr[] ist ein Array aus 4 ints
    Laut Breakpoints und Einzelschrittverfolgung ist vor Einsprung in lcd_data der Wert von lcd_cpos=1 wenn c=0.

    Ich versuche dort, aus einer uint8 Zahl die eine cursorposition auf einem langen String (bis 80 Zeichen, enthält letztlich Reihe und Spalte in einem Display) zu berechnen. Ich würde ja mit Modulo % arbeiten aber da hat jemand das erste Zeichen auf die 0.te Display Position definiert und modulo Operationen mit 0 erzeugen schon mal Div/0 Fehler... Also Suche ich einen weg um aus Angaben wie 0x14 die 2.te Zeile in der 4 Spalte zu berechnen wobei die Koordinaten dann aber leider Zeile 1, spalte 3 ist. Letzteres sind Vorgaben die ich so übernehmen muss um Code Compatibilität zu halten.

    Und zur Aussage "Da braucht man nicht den Assemblercode anzuschauen." .. ich würds selbst nicht glauben wenn ich es nicht mit eigenen Augen sehen würde!
    Gruß
    Geändert von RolfD (14.05.2014 um 06:24 Uhr)
    Sind Sie auch ambivalent?

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Sorry, wenn ich das so sage, aber von deinem Code krieg ich Augenkrebs. Da gehen Code und Kommentar so durcheinander, nach if oder else könnte man eine neue Zeile anfangen ....


    Aber zu deinem Problem mit Modulo:
    Code:
    #define LENGHT 20
    
    int main() {
        int i;
        int xpos;
        int line;
    
        for(i = 0; i < 80; i++) {
            xpos = i % LENGHT;
            line = i / LENGHT;
            printf("%d, %d, %d\n", i, xpos, line);
        }
    }
    Dieser Code sollte das machen, was du beschreibst und funktioniert ohne Probleme auf meinem PC. Ich probiere C-Code gerne auf dem PC aus (ich verwende keine Atmel und hab daher das Studio nicht)

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

Ähnliche Themen

  1. switch case aud union und struct gehen schief, hat einer eine Idee warum ???
    Von jdelphi im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 0
    Letzter Beitrag: 29.09.2011, 13:04
  2. Signalweiche mit Avr- jemand eine idee??
    Von spass-basti im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 14
    Letzter Beitrag: 23.04.2007, 15:21
  3. Potentialproblem. Jemand eine idee?
    Von sebastian.heyn im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 22.08.2005, 16:55
  4. Bild auf TV erzeugen - Jemand eine IDEE?
    Von sebastian.heyn im Forum AVR Hardwarethemen
    Antworten: 20
    Letzter Beitrag: 03.05.2005, 13:28
  5. Ports beim ATmega32 gehen nicht! warum?? jemand eine Idee!!
    Von raptor_79 im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 18.01.2005, 14:55

Berechtigungen

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

LiFePO4 Speicher Test