www.mikrocontroller.net

Forum: Compiler & IDEs MAX3110 Uart C-Quellcode


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also vielen Dank schonmal für die schnelle antwort
Hier ist erst die Konfiguration:
//CONFIGURE MAX3110
  //select MAX3110 RPM
  PORTA &=~ _BV(P0);

   SPDR = 0xC4;   //Writeconf, Data available interrupt
   rxbuf = SPDR;      
  while(!(SPSR & (1<<SPIF)));
  SPDR = 0x0B;  //Baudrate 9600
   rxbuf = SPDR;      
  while(!(SPSR & (1<<SPIF)));
  
  //deselect MAX3110 RPM
  PORTA |= _BV(P0);
  //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.
  //select MAX3110 RPM
  PORTA &=~ _BV(P0);

for(int i = 0; i<5;i++)
{
  SPDR = 0;
  rxbuf = SPDR;      
  while(!(SPSR & (1<<SPIF)));
      
  SPDR = 0;            
  confrpm = SPDR;    //receive MSB -> Configuration
  while(!(SPSR & (1<<SPIF)));
  
  SPDR = 0;            
  datarpm[i] = SPDR;  //receive LSB -> Data
  while(!(SPSR & (1<<SPIF)));  
}
  //deselect MAX3110 RPM
  PORTA |= _BV(P0);
  //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???

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
SPDR = 0; /* dummy transmission */
while(!(SPSR & (1<<SPIF))); /* wait for SPI cycle to finish */
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

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.