mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI daten via UART


Autor: Thomas (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Escamoteur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hat das ganze mit SPI zu tun?

Autor: Detlev T. (detlevt)
Datum:

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

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.