MAX3110 Uart C-Quellcode

Gast #668536
Hallo,

benutze einen atmega644 und dessen RS232 Schnittstelle ist schon in 
gebrauch, muss aber ein Gerät das über RS232 Daten abgibt noch an den 
Atmega anschliessen. Deshalb hab ich einen Max3110 mit angeschlossen der 
ja über SPI die Daten entgegennimmt.
So der Baustein wurde genauso laut Datenblatt eingestellt und die 
konfiguration kann ich auch erfolgreich wieder zurücklesen.
Allerdings habe ich beim einlesen der Daten probleme!!!
Das angeschlossene Gerät liefert mir über RS232 insegsamt 5Pakete, wobei 
4Pakete Zahlen sind und das fünfte ist das CR.
So bekomme ich das aber leider nicht rüber!!!
Wer hat den schon eine RS232 Schnittstelle mit diesem Baustein zum 
laufen gebracht und würde seinen Quelltext hier mal posten???
Moderator Persönliche Seite
Was genau hast du denn bisher als Quellcode?  Was funktioniert, was
funktioniert nicht?

Ich habe schon MAX3110-Code gesehen, aber der stammte aus einem
kommerziellen Projekt, kann ich also nicht posten.  Wenn du mit
hohen Datenraten arbeitest, sollte deine Interruptannahme natürlich
nicht zu lange dauern.  Bei 9600 Bd dauert ein Zeichen ca. 1 ms
(also eine Ewigkeit), bei 115200 Bd dagegen nur noch 87 µs (bei
einem 1-MHz-AVR also 87 Prozessortakte).

Da der MAX3110 einen 8-Byte-FIFO hat, entspannt sich die Sache
aber ein wenig, sofern deine ISR so lange weiterliest, bis der
Status sagt, dass keine Zeichen mehr im FIFO sind.  Den Status
musst du ja ohnehin immer zusammen mit dem Zeichen lesen, der
liegt dir also sowieso schon vor.
Gast
Also vielen Dank schonmal für die schnelle antwort
Hier ist erst die Konfiguration:
1
//CONFIGURE MAX3110
2
  //select MAX3110 RPM
3
  PORTA &=~ _BV(P0);
4

5
   SPDR = 0xC4;   //Writeconf, Data available interrupt
6
   rxbuf = SPDR;      
7
  while(!(SPSR & (1<<SPIF)));
8
  SPDR = 0x0B;  //Baudrate 9600
9
   rxbuf = SPDR;      
10
  while(!(SPSR & (1<<SPIF)));
11
  
12
  //deselect MAX3110 RPM
13
  PORTA |= _BV(P0);
14
  //END CONFIGURE MAX3110
Die kann ich auch so wieder auslesen und sie funktioniert.
Nachdem die konfiguration gesendet ist will ich die daten aus dem 
MAX3110 hohlen und wie gesagt sind insgesamt 4 Zahlen plus CR.
1
  //select MAX3110 RPM
2
  PORTA &=~ _BV(P0);
3

4
for(int i = 0; i<5;i++)
5
{
6
  SPDR = 0;
7
  rxbuf = SPDR;      
8
  while(!(SPSR & (1<<SPIF)));
9
      
10
  SPDR = 0;            
11
  confrpm = SPDR;    //receive MSB -> Configuration
12
  while(!(SPSR & (1<<SPIF)));
13
  
14
  SPDR = 0;            
15
  datarpm[i] = SPDR;  //receive LSB -> Data
16
  while(!(SPSR & (1<<SPIF)));  
17
}
18
  //deselect MAX3110 RPM
19
  PORTA |= _BV(P0);
20
  //END READ DATA
Mit diesem Teil will ich die Daten in datarpm die Werte schreiben und da 
stimmt was nicht hier bekomme ich keine richtigen werte???
Moderator Persönliche Seite
Steffen wrote:

> Nachdem die konfiguration gesendet ist will ich die daten aus dem
> MAX3110 hohlen und wie gesagt sind insgesamt 4 Zahlen plus CR.

Naja, du solltest zumindest erst einmal auf den Interrupt warten...

> for(int i = 0; i<5;i++)

Hier ist auch nicht klar, ob tatsächlich schon alle 5 Zeichen im
FIFO sind, ich würde also jeweils einzeln auf den Status testen.

> {
>   SPDR = 0;
>   rxbuf = SPDR;
>   while(!(SPSR & (1<<SPIF)));

Hier liegt der Hund begraben.  Du liest ein, bevor du überhaupt
den SPI-Zyklus durchgeschoben hast.  Das muss heißen:
1
SPDR = 0; /* dummy transmission */
2
while(!(SPSR & (1<<SPIF))); /* wait for SPI cycle to finish */
3
rxbuf = SPDR;

Außerdem besteht jeder Lesezyklus aus zwei SPI-Zyklen (16 bits),
nicht aus drei.  Im ersten der beiden Zyklen liest du den Status,
im zweiten die Daten selbst.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.