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???
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.
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???
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.