Hallo zusammen, ich habe ein Denkproblem, ich möchte meine enpfangene von einem ADC bits einordnen und später via UART weitersenden. Die ausgelöste fallende Interupt INT0 auf den PORTD soll der transfert starten. Mein ADC spuckt pro Messung bzw. kanal 20 bit und habe ich 8 kanäle angeschloßen. Wie kann ich die empfangene Bits einordnen und weiter via UART weitersenden. hat jemand ein Tipp. ich benutze ATXmega128a1 und STK600 Hier meine code: #include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include "spi_driver.h" #include "port_driver.h" uint8_t Data_Shift_Count; uint8_t Receive_Data[n]; uint8_t n; uint8_t Kanal; unsigned char Channel; int main (void) { PORT_SetPinsAsInput( &PORTD, 0x01); // fuer INT0 (extern interrupt) PORT_ConfigurePins( &PORTD, 0x01, false, false, PORT_OPC_WIREDANDPULL_gc, PORT_ISC_FALLING_gc ); /* Sense Falling Edge */ PORT_ConfigureInterrupt0( &PORTD, PORT_INT0LVL_MED_gc, 0x01 );// Configure Interrupt0 to have medium interrupt level, triggered by pin 2. */ PMIC.CTRL |= PMIC_MEDLVLEN_bm;//Enable medium level interrupts in the PMIC. sei();//Enable the global interrupt flag. SPID_CTRL = (1<<SPI_MASTER_bm) | (1<<SPI_CLK2X_bm) | (1<<SPI_ENABLE_bm);//MOSI & SCK,enable spi,clk/ 32Mhz???? SPIF_INTCTRL |= (1<<SPI_INTLVL1_bm); sei();//Enable the global interrupt flag. while (1) } ISR(PORTD_INT0_vect ) { SPID_DATA= 0xFF;// initiate the data transmission while (!(SPID_STATUS &(1<<SPI_IF_bm)))// wait for complet transmission Data_Shift_Count = 0; } ISR(SPID_STC_vect) { Data_Shift_Count++;//erhöt der counter Receive_Data[n]=SPID_DATA; do { switch(Kanal){ case 1: Channel =Receive_Data ; // ch = 10001111 Bit 20 to bit 13 Data_Shift_Count++; case 2: Channel = Receive_Data; // ch = 10011111 Bit 12....bit9 Data_Shift_Count++; case 3: Channel = 0xAF; // ch = 10101111 bit8....1 Data_Shift_Count++; case 4: Channel = Receive_Data; // ch = 10111111 case 5: Channel = Receive_Data; // ch = 11001111 case 6: Channel = Receive_Data; // ch = 11011111 case 7: Channel = Receive_Data; // ch = 11101111 case 8: Channel = Receive_Data; // ch = 11111111 . . . . . case 23: Channel: default: Channel = Receive_Data; }; }(Data_Shift_Count<=20); uint8_t resultat = Channel; } Danke Thom
Ich sehe überhaupt keine break Anweisungen in dem switch-case. Ist das wirklich dein lauffähiges Programm?
Hallo Thomas, wenn ich deine Frage richtig verstanden habe, suchst du nach einer Idee, die Werte als Bytes zu übertragen und dann auf Empfängerseite eine Synchronisation durchzuführen. Ich hätte da folgende Idee: Jeder Messwert wird in drei Bytes übertragen. 6 Bit im ersten, je sieben im zweiten und dritten. Das MSB im ersten Byte ist 1, im zweiten und dritten 0. Ist Bit6 im ersten Byte zusätzlich gesetzt, handelt es sich um Kanal 0. Danach Kanal 1 (Bit6=0) usw. bis alle Kanäle übertragen sind. Gruß, DetlevT
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.