Forum: Mikrocontroller und Digitale Elektronik Zuviel vom Eeprom gelesen?


von Nils H. (curby)


Lesenswert?

Moin,

ich habe ein 128kB SPI EEprom an einem Atmega16.
Ich sende über ein eigenes C++ Konsolen Programm eine Adresse an den 
Atmega und dieser sendet dann 9228 Bytes an den PC. Hier werden diese 
Daten von dem Konsolenprogramm in eine Datei geschrieben.

Das Problem ist dass oftmals die Verbindung hängen bleibt und ich dann 
den Seriellen Schnittstelle zu USB Adapter ab- und wieder ranmachen 
muss. In den anderen Fällen funktioniert die Übertragung tadellos.

Ich habe auch die Funktion implementiert, dass nur ein einziges Byte 
gelesen wird. Hier das selbe Prinzip, erst die Adresse senden, dann 1 
Byte empfangen. Hier jedoch funtioniert es scheinbar ohne jegliche 
Probleme.

Ich schließe aus, dass es am Atmega liegt, da ich den anlasse und nach 
ab- und anschließen des Adapters alles wieder funktioniert. Warum bricht 
die Verbindung zusammen bzw. warum hängt sich der Adapter auf? Baudrate 
ist 115200. Ich mache keine Empfangskontrolle, Adresse senden und Daten 
senden, jedoch wenn ich ein Zeichen empfangen will (Konsole), wiederholt 
er den Vorgang bis min. ein Zeichen im Puffer ist - die Verarbeitung der 
Daten ist ja wesentlich schneller als der Sendevorgang.

mfg,
Nils

von Carsten W. (eagle38106)


Lesenswert?

Hi,

schon mal statt der Daten vom EEPROM einfach Dummy-Daten versendet? 
Tritt der Fehler dann auch auf?

Gibt es bei den Interrupts von USART und SPI Deadlocks?

Carsten

von Nils H. (curby)


Lesenswert?

Auch bei Dummydaten hört die Übertragung mittendrin auf und die 
empfangene Datei ist unvollständig und keine 9228 Bytes groß. Wiegesagt, 
wenn ich dann den Adapter ab und wieder ranmache, ohne den Atmega zu 
reseten, funktioniert die serielle Schnittstelle wieder.

Hier mal ein paar Auszüge - Code stelleneise weggelassen; Insbesondere 
ist die Getch() so in Ordnung? (ganz unten):

Hier der Code vom Atmega, wenn ein Uart Zeichen empfangen wurde (löst 
Interrupt aus):
1
  void bild_op(unsigned char stat,unsigned char op){
2
    union{
3
      unsigned char _byte[4];
4
      unsigned long _long;
5
    }addr;
6
    unsigned int x,y;
7
8
    addr._byte[2] = getch();      //Adresse beziehen
9
    addr._byte[1] = getch();
10
    addr._byte[0] = getch();
11
12
    wait_a(addr._byte[2]);
13
    
14
    init_op(addr._byte,op);   //IC auf gesendete Adresse lesen/schreiben vorbereiten  
15
    
16
    if(stat == 0){          
17
      write(getch());
18
    }  
19
20
    close_ic(addr._byte[2]);      
21
  }
22
23
  befehl = getch();
24
25
  if(befehl == 'A') bild_op(0,0);       
26
  else putch(ERROR);

hier die zugehörigen Funktionen der Konsole:
1
void CTransfer::readfile(unsigned long adresse,const char* datei){
2
  fstream filestream(datei, ios::out|ios::trunc);
3
  filestream.close();
4
  filestream.open(datei, ios::in|ios::out);
5
6
  init_verbindung(adresse,2);
7
  for(int x=0;x<9228;x++){
8
    filestream << Getch();
9
  }
10
}
11
12
void CTransfer::init_verbindung(unsigned long adresse,unsigned char mode){
13
  addr._long = adresse;
14
  if(mode == 0) Putch('A');
15
  Putch(addr._byte[2]);
16
  Putch(addr._byte[1]);
17
  Putch(addr._byte[0]);
18
}
19
20
unsigned char CSerialPort::Getch(){
21
  unsigned char str[1];
22
  do{
23
    ReadFile(hSerial,str,1,&dwbytesread,NULL);
24
    
25
  }while(dwbytesread == 0);
26
  return str[0];
27
}

von Nils H. (curby)


Lesenswert?

Da ich nicht mehr editieren kann:

Achja, wenn ich über Hyperterminal die Datei schicke, bricht die 
Verbindung auch zusammen nach einer ungewissen Anzahl Bytes. Kann es an 
meinem Apadater liegen?

von H.Joachim S. (crazyhorse)


Lesenswert?

falls das ein prolific-Dingen ist: ja.
Das Zeug ist Müll. Mit FDTI-Chips hatte ich noch keine Probleme.

von Michael H. (michael_h45)


Lesenswert?

Kann die Probleme bei dem billigsten USB-Seriell-Wandlern bestätigen. 
Mit genau dem Symptom, dass mittendrin der Datenstrom abbreißt und der 
"Endpoint" auf nichts mehr reagiert.

http://de.wikipedia.org/wiki/Lehrgeld
=)

von Nils H. (curby)


Lesenswert?

Ach Lehrgeld^^. Ich hab den doch umsonst bekommen^^.Ich versuch es mal 
am richtigen Seriellen Port vom Desktop Pc :D.

EDIT: Ok am Tower PC bricht die Verbindung NICHT ab. SOviel dazu..

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.