SPI daten via UART

Gast #1746252
Lesenswert?

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
#1747070
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren