Forum: Mikrocontroller und Digitale Elektronik SPI daten via UART


von Thomas (Gast)


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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ich sehe überhaupt keine break Anweisungen in dem switch-case. Ist das 
wirklich dein lauffähiges Programm?

von Escamoteur (Gast)


Lesenswert?

Was hat das ganze mit SPI zu tun?

von Detlev T. (detlevt)


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

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.