mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Prog. läuft auf Mega128 aber nicht auf Mega8!


Autor: Rush (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute...

Ich habe da ein kleines Problem.
Undzwar habe ich eine kleine Temperaturregelung geschrieben (WinAVR). 
Das Programm läuft auch einwandfrei auf meinem mega128 Testboard.

Nun habe ich es auf einen mega8 geflasht und es tut sich leider 
garnichts.
Ich habe die Ports abgeändert, die Quarzfrequenz angepasst, aber es tut 
sich leider überhaupt nicht. Das Display zeigt auch nichts an außer 
haufen schwarze Kästchen.

Platine ist auch korrekt aufgebaut und durchgemessen.

Der mega8 ist auch in Ordnung, habe alle Ports gecheckt.

Hat jemand eine Idee woran das liegen könnte?

Gruß, Konrad

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Registerzuordnung und auch der Aufbau und die Anzahl der eingebauten 
peripheren Module ist bei beiden Controllern unterschiedlich. Es ist ein 
Wunder, wenn Du das Programm vom 128er für den 8er überhaupt assembliert 
bzw. kompiliert bekommst.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Travel Rec. wrote:
>wenn Du das Programm vom 128er für den 8er überhaupt assembliert
> bzw. kompiliert bekommst.

Hatter ja scheinbar auch nich, er hat einfach das HEX für den 128er auf 
den 8er gebrannt...
Ne Jungchen, das geht schief...

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rush wrote:

> Nun habe ich es auf einen mega8 geflasht und es tut sich leider
> garnichts.

Natuerlich tut sich nichts, was hast Du erwartet?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst auf jeden Fall noch das Include-File mit den 
Registerdefinitionen austauschen und den Code neu assemblieren. Sonst 
hast du keine Chance.

Viel Spass mit den Fehlermeldungen ;-)

Sebastian

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der Aufbau der Vektortabelle ist auch inkompatibel....

Gruss Otto

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An die anderen: Startposting komplett gelesen?
Zitat:""Ich habe die Ports abgeändert, die Quarzfrequenz angepasst,
aber es tut sich leider überhaupt nicht. Das Display zeigt auch nichts 
an außer haufen schwarze Kästchen.""

Um das zu machen, muß man neu übersetzen.
Jetzt gibt es zwei Möglichkeiten:
Entweder falsches HEX-File erwischt oder es wurden Eigenheiten des 
Mega128 übersehen, die jetzt da noch drin sind. Wenn die Übersetzung 
über AVRStudio erfolgt, muß der CPU-Typ auch in den Projekteigenschaften 
geändert werden, bei Direktübersetzung per Makefile ist dort evtl. der 
CPU-Typ zu ändern, Austausch der Include-Datei alleine reicht da nicht. 
Also dies nochmal prüfen.

Gruß
Jadeclaw.

Autor: Henrik J. (henrikj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Makefile anpassen. Dann könnte das auch passen. Und dann natürlich neu 
kompilieren.

Autor: Christian U. (z0m3ie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er hat noch nicht mal gesagt was für ne Sprache und schon spekulieren 
alle wild umher ohne auch nur ansatzweise das Problem zu kennen.

Beschreib mal etwas genauer was du da versuchst.

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian, es steht drin.
Ich lese folgendes aus der Frage heraus:
CPU: AVR Mega-Series, ATMega128/8
Sprache: C
Compiler: GCC mit avrlib
Toolchain: WinAVR
Display: Text, HD44780-basiert
Auch der Fehler ist klar, das Display wird entweder garnicht oder nicht 
korrekt initialisiert. HD44780-Diplays zeigen in diesem Falle genau das 
genannte Bild. Kontrasteinstellung muß ok sein, am Mega128 geht es ja, 
falls der Fragesteller da zwischenzeitlich nichts verstellt hat.

Ich gehe davon aus, daß die Initialisierung des Displays nicht korrekt 
erfolgt, entweder weil das Timing daneben ist oder der Initcode nicht 
erreicht wird, weil irgendwo noch eine Programmschleife darauf wartet, 
daß irgendeine beim ATMega8 nicht vorhandene oder anders beschaltete 
Hardware antwortet. Sowas in der Art hatte ich auch schon erlebt und mir 
echt 'nen Wolf gesucht.

Gruß
Jadeclaw.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man vergisst auch ganz schnell mal, das Programm
auch wirklich für einen ATMega8 zu kompilieren.

Autor: Rush (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn ich doch schreibe dass ich das Prog unter WinAVR geschrieben 
habe müsste doch eigentlich klar sein dass ich es in C geproggt habe.

Ok, also nochmal in der Zusammenfassung was ich überhaupt gemacht habe:

- Fuses des mega8 auf Internes Quarz 8Mhz gesetzt
- defines für die Frequenz entsprechend angepasst
- defines der Ports entsprechend angepasst
- Controllertyp in den Projekteigenschaften ebenfalls auf mega8 gestellt
- in den Projekteigenschaften zusätzlich die Frequenz von 8 Mhz 
eingetragen.

Der Compiler hat außer einer Warnmeldung zu meiner delay-Funktion nichts 
anderes ausgespuckt. Darüber mal hinweggesehen. Es müsste sich 
wenigstens ein Messwert auf dem LCD zeigen.

@ Michael G.
Was erwartest du denn wenn du ein Programm auf nen Controller schiebst? 
Wohl dass es läuft!

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier wurde geschrieben dass die Interruptvektoren nicht zusammenpassen. 
Hast du die schon geprüft?

Sebastian

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was meckert er denn bei deiner delay funktion? Evtl. stimmt das Timing 
nicht ?!

Autor: Rush (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende keine Interrupts.

Und wegen dem delay sagt der:

../TempControlMega8.c:114: warning: conflicting types for 'long_delay'

Die Funktion dazu sieht so aus:
void long_delay(uint16_t ms) {        
    for(; ms>0; ms--) _delay_ms(1);      
}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>../TempControlMega8.c:114: warning: conflicting types for 'long_delay'

Da ist wohl der Prototyp für long_delay() faul, oder es gibt
bereits eine Funktion long_delay() in irgendeiner LIB.

>Die Funktion dazu sieht so aus:
>
>void long_delay(uint16_t ms) {
>    for(; ms>0; ms--) _delay_ms(1);
>}

Ich hasse solche for() Schleifen.
Mach es einfach so:

 while(ms--) _delay_ms(1);

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Timer des Mega128 und Mega8 verwenden ebenfalls andere 
Einstellungen.

Autor: Rush (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende auch keinen Timer.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rush wrote:

> @ Michael G.
> Was erwartest du denn wenn du ein Programm auf nen Controller schiebst?
> Wohl dass es läuft!

Wenn der Code korrekt und die Target-Plattform die richtige ist, schon. 
Das ist in diesem Fall aber nicht so, daher brauchst Du auch nicht 
erwarten, dass es funktioniert. Der Grund sollte einleuchten.

Autor: Christian U. (z0m3ie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry hatte das mit dem WinAVR überlesen.

Oft ist es bei Displays so das tatsächlich das timing nicht stimmt.
Wenn deine delay Funktion irgendwo anders deklariert wurde z.b. leer und 
die Display routinen darauf aufbaun passiert genau das beschriebene.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der Compiler hat außer einer Warnmeldung zu meiner delay-Funktion
> nichts anderes ausgespuckt.

Welche war das?
Nicht alle Warnungen sind harmlos

> Darüber mal hinweggesehen.

Das ist bei manchen Warnungen keine gute Idee

> Es müsste sich wenigstens ein Messwert auf dem LCD zeigen.

Wenn deine LCD Routinen auf diesem delay basieren, dann nicht
unbedingt.

Am besten zeigst du mal den Code. Dann hört auch das Rätselraten
auf.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Treat Warnings as Errors ;)

Autor: Rush (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oje... den Code wollt ihr also sehen... aber nicht wundern, bin blutiger 
Anfänger ;)

// Display an PORTC
// MAX6675 an PORTB
// Taster an PORTD
// Output Relais an PORTD


#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <avr/io.h>
#include <util/delay.h>
#include "lcd-routines.h"

extern void lcd_init(void);
extern void lcd_clear(void);
extern void set_cursor(uint8_t x, uint8_t y);
extern void lcd_string(char *data);

/* Defines MAX !!*/

#define MAX_DDR DDRB
#define MAX_PORT PORTB
#define MAX_PIN PINB

#define CS PB0
#define SCK PB1
#define SO PB2
// ------------------------- //
/* Defines Menütasten */

#define  MENU_DDR DDRD
#define  MENU_PIN PIND
#define  MENU_PORT PORTD

#define MENU_SET PD2
#define MENU_UP PD0
#define MENU_DOWN PD1
// ------------------------- //
/* Defines Relais */
#define REL_OUT_DDR DDRD
#define REL_OUT_PORT PORTD
#define REL_OUT PD7
// ------------------------- //

// ---------- Temp. holen -----------
uint16_t gettemp(void){                  
  uint8_t bit = 0, bitnr = 12;          
  uint8_t foo1 = 0;
  uint16_t Rohdata = 0;

  
  MAX_PORT &= ~(1 << CS);  

  for(foo1 = 0 ; foo1 < 16 ; foo1++){

    bit = 15 - foo1;
  

    MAX_PORT |= (1 << SCK);  
  

    if((bit <= 14) && (bit >= 3)){

      if((MAX_PIN & (1 << SO))){
        bitnr--;
        Rohdata |= (1 << bitnr);
      }else{
        bitnr--;
        Rohdata &= ~(1 << bitnr);
      } 

    }else{
      bitnr = 12;
    }

    MAX_PORT &= ~(1 << SCK);
  
  }


  MAX_PORT |= (1 << CS);
    

  return Rohdata;  //gibt die 12 relevanten Bits zurück
  }

// ----------- Long Delay -------------------
void long_delay(uint16_t ms) {        
    for(; ms>0; ms--) _delay_ms(1);      
  //while(ms--) _delay_ms(1);
}
// ------------------------------------------

//------------ Taster entprellen ------------

inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
    if ( ! (*port & (1 << pin)) )
    {
        /* Pin wurde auf Masse gezogen, 100ms warten   */
        long_delay(110);  // max. 262.1 ms / F_CPU in MHz
        if ( *port & (1 << pin) )
        {
            /* Anwender Zeit zum Loslassen des Tasters geben */
            long_delay(50);
            return 1;
        }
    }
    return 0;
}
//-------------------------------------------


void initavr(void){              //AVR initialisieren

  MAX_DDR &= ~(1 << SO);          
  MAX_DDR |= ((1 << CS) | (1 << SCK));
  
  MAX_PORT |= (1 << CS);          
  MAX_PORT &= ~(1 << SCK);

}


int main(void)
{
  char MenuVal;
  char intMaxTemp;
  int intMaxTempCompare;
  char strMaxTemp[3];

  char intOffset;
  char intOffsetCompare;
  char strOffset[3];

  initavr();
  lcd_init();
  MENU_DDR &=~ (1<<MENU_SET) | (1<<MENU_UP) | (1<<MENU_DOWN);    
  MENU_PORT |= (1<<MENU_SET) | (1<<MENU_UP) | (1<<MENU_DOWN);    
  
        REL_OUT_DDR |= (1<<REL_OUT);    // Ausgang für Relais
  REL_OUT_PORT |= (1<<REL_OUT);

  MenuVal = 0;
  intMaxTemp = 187;
  intOffset = 0;

while(1){
  char temp[7]; 
  double temperature;

  
  if (debounce(&MENU_PIN, MENU_SET)==1)        
    {
      MenuVal++;
    }

  if (MenuVal == 3)  // beim letzten Menü auf Temp.Anzeige wechseln
    {
      MenuVal=0;
    }


switch (MenuVal){
  case 0:
    temperature = gettemp();  
  
    intMaxTempCompare = intMaxTemp * 4;
    intOffsetCompare = intOffset * 4;  
    temperature = temperature + intOffsetCompare;

    if (temperature < intMaxTempCompare)  
    {
      temperature = (temperature / 4);
      dtostrf(temperature, 2, 2, temp);
      long_delay(200);
      lcd_clear();
      lcd_string(temp);
      set_cursor(0,2);
      lcd_string("Heizung an!");
      REL_OUT_PORT &=~ (1<<REL_OUT);        
    }

    if (temperature >= intMaxTempCompare)
    {
      temperature = (temperature / 4);
      dtostrf(temperature, 2, 2, temp);
      long_delay(200);
      lcd_clear();
      lcd_string(temp);
      set_cursor(0,2);
      lcd_string("Heizung aus!");
      REL_OUT_PORT |= (1<<REL_OUT);        
    }break;
  
  case 1:
    lcd_clear();
    set_cursor(0,1);
    lcd_string("Set max. Temp.");
    set_cursor(0,2);
    if (debounce (&MENU_PIN, MENU_UP)==1)
      {
        intMaxTemp++;
      }
    
    if (debounce(&MENU_PIN, MENU_DOWN)==1)
      {
        intMaxTemp--;
      }
    itoa(intMaxTemp, strMaxTemp, 10);  

    lcd_string(strMaxTemp);
    long_delay(23);
    break;
  
  case 2:
    lcd_clear();
    set_cursor(0,1);
    lcd_string("Set Offset Temp.");
    set_cursor(0,2);
    if (debounce(&MENU_PIN, MENU_UP)==1)
      {
        intOffset++;
      }
    
    if (debounce(&MENU_PIN, MENU_DOWN)==1)
      {
        intOffset--;
      }
    itoa(intOffset, strOffset, 10);
    lcd_string(strOffset);
    long_delay(23);
    break;}


  }
}



Nochmal was im Nachhinein. Ich habe am Schaltausgang parallel zum Relais 
noch eine LED mit drangehängt. Das würde doch bedeuten, auch wenn die 
Initialisierung des Displays nicht korrekt ist, meine LED trotzdem an 
oder aus gehen müsste wenn ich den Fühler mit einem Feuerzeug anheitze.

Autor: Rush (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also einen Fehler habe ich schonmal entdeckt. Undzwar hatte ich den 
RW-Pin des Displays nicht an GND gelegt. Kurz gelötet und es scheint als 
klappt die Initialisierung. Aber Test bekomme ich trotzdem nicht 
angezeigt. Auch nicht wenn ich einfach nur paar Zeilen schreibe die das 
Display initialisieren und einfach nun einen String ausgeben.

Autor: Udo S. (udo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rush,

also den Teil kannst du dir sparen:
// ----------- Long Delay -------------------
void long_delay(uint16_t ms) {        
    for(; ms>0; ms--) _delay_ms(1);      
  //while(ms--) _delay_ms(1);
}

und überall wo du " long_delay " aufrufst schreibst du einfach 
"_delay_ms(n)"
wobei n=Anzahl der Millisekunden.
Außerdem ist die delay.h dahingehend geändert worden, das ohne weiteres 
auch über 262.1 ms eingegeben werden können. Also z.B. auch 
_delay_ms(1000)

Gruß
Udo

Autor: ---=DIAN=--- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht könntest Du die lcd-routines.h und die dazugehörige 
lcd-routines.c auch nochmal posten?

ansonsten um alles andere auszuschliessen schonmal sowas wie:

int main(void)
{
  char MenuVal;
  char intMaxTemp;
  int intMaxTempCompare;
  char strMaxTemp[3];

  char intOffset;
  char intOffsetCompare;
  char strOffset[3];

  initavr();
  lcd_init();

  lcd_clear();
  set_cursor(0,2);
  lcd_string("Test");
}

ausprobiert? also nur das notwendigste?
Da der Mega8 kein JTAG usw. besitzt, scheiden die Fuses als Fehlerquelle 
nahezu aus. Prüfe doch nochmal die Verdrahtung, messen oder im Main Pin 
an- und abschalten und das messen (DB0-DB7[8bit] DB4-DB7/DB0-DB3[4bit] 
(weiß nicht mehr so genau was man bei 4bit braucht),EN,RS. RW liegt ja 
eh schon auf masse)

Autor: Rush (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also vorerst Entwarnung an alle ;-)
Das Ding läuft endlich.

Fehler die ich gefunden hatte:

- RW Pin des Displays lag nicht auf Masse.
- ein Pin (DB0-DB3), weiss nicht mehr genau welcher lag auf Masse.
  Evtl. hat das Display dann in 8-Bit Modus gewechselt oder zumindest 
8-Bit
  Daten erwartet. Verwende aber den 4-Bit Modus.

Nach diesen Änderungen bliebt das Display diesmal komplett leer.

Zum Schluss hatte ich einfach nochmal ein komplett neues Projekt 
angelegt wo von Anfang die Einstellunge für den mega8 vorgenommen 
wurden.

Desweiteren habe ich die abgeänderte (waren auch nur die Timings 
gewesen) durch die originale lcd-routines.c ersetzt.

Und siehe da es lief auf Anhieb.

lcd-routines.h und lcd-routines.c habe ich auch aus den Netz. Bei 
Interesse kann ich sie auch mal posten.

Danke für die Mühe die Ihr euch gemacht habt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.