Forum: Compiler & IDEs MAX3110 Uart C-Quellcode


von Steffen (Gast)


Lesenswert?

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???

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Steffen (Gast)


Lesenswert?

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???

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

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.