Forum: Mikrocontroller und Digitale Elektronik Daten des ATTiny24 über SPI auslesen


von Anthony S. (anthony_02)


Lesenswert?

Hi,

bin noch recht neu in der µC Welt.

Hab nen ATTiny24 und habe ihn glaube ich dazu gebracht mir AA über SPI 
auszugeben. Jedoch schaffe ich es nicht am Rechner das AA zu sehen.

Hab in C++ ein Programm geschrieben welches mir den COM-Port ausliest, 
an welchem der µC über ein STK500-Board (USB-Stick) angeschlossen ist. 
Allerdings muss ich da sowas wie die Baudrate, Paritybit und Stopbits 
angeben. Doch weiß ich jetzt nicht wirklich wo ich dem µC diese Daten 
gegeben habe, bzw. ob diese für den µC fest vorgegeben sind.

Kann mir da jemand sagen wie ich das raus finde oder ob ich das 
irgendwie anders machen muss?

Im folgenden das Programm welches ich auf den µC gespielt habe.
------------------------------------------------------------------------ 
-
#include <avr/io.h>

#include <stdlib.h>

#include <util/delay.h>

void SPI_init(void)

{

  DDRA |= (1<<PA4)|(1<<PA5); //Output: PA4=USCK, PA5=DO

  DDRA &= ~(1<<PA6); //Input: PA6=DI

  PORTA |= (1<<PA6); //int. Pull-up an PA6 aktivieren

  DDRA |= (1<<PA7); //LED auf Ausgang

  USICR = (1<<USIWM0) | (1<<USICLK)|(1<<USITC)| (1<<USICS1);

  // USIWM0 = 1: SPI-Betrieb mit DO, DI und USCK

  // USICLK = 1, USITC = 1, USICS1 = 1: generiert den Taktimpuls für das 
Schieberegister und

  // den 4bit Timer. Der Takt wird am USCK-Pin (PA4) ausgegeben.

}

void SPI_transfer(int data)

{

  USIDR = data; //Daten in Data Register laden

  USISR |= (1<<USIOIF); //Überlaufflag löschen

  while (!(USISR & (1<<USIOIF))) //solange kein Timerüberlauf...

  {

    USICR |= (1<<USITC); //Toggle clk (2x)

    USICR |= (1<<USITC);

  }

}

  int main (void)

{

  SPI_init();

  while(1)

  {

    SPI_transfer(0xAA); // Daten (AA) senden

    PORTA |= (1<<PA7); // Led on

    _delay_ms(1000);

    PORTA &= !(1<<PA7); // Led off

    _delay_ms(1000);

  }

}
------------------------------------------------------------------------ 
-

Desweiteren konnte ich keinen kostenlosen Serial Port Monitor, RS232 
Sniffer oder ähnliches finden welches auf Win7 64 bit läuft.

Wüsste dort vieleicht jemand was womit ich sehen kann was durch meinen 
COM-Port geht?

von Oliver J. (skriptkiddy)


Lesenswert?

Anthony Swofford schrieb:
> SPI

> COM-Port

Da passt was nicht zusammen.

von Anthony S. (anthony_02)


Lesenswert?

Ich habe einen USB-Stick mitdem ich meinen µC programmiere, welchen ich 
in AVR-Studio als STK500-Board verwende.

dieser USB-Stick schickt die SPI daten vom µC durch den USB-Stick über 
einen COM-Port und umgekehrt

von Oliver J. (skriptkiddy)


Lesenswert?

Anthony Swofford schrieb:
> ch habe einen USB-Stick mitdem ich meinen µC programmiere, welchen ich
> in AVR-Studio als STK500-Board verwende.
Wie heißt das Teil?

von Hubert G. (hubertg)


Lesenswert?

Du wirst einen USB-Programmer haben den das AVR-Studio als STK500 
erkennt und deinen µC über ISP programmiert.
Die ISP-Schnittstelle verwendet die SPI-Pin, hat aber nichts damit zu 
tun.

von Anthony S. (anthony_02)


Lesenswert?

OK, dann weiß ich jetzt wieso ich ISP und SPI immer verwechselt habe.

Aber ich müsste den USB-Programmer doch auch nutzen können um die vom µC 
ausgehenden Daten am Rechner anzeigen zu lassen.

Kann mir da vieleicht jemand sagen wie ich das genau mache?

von Hubert G. (hubertg)


Lesenswert?

Nein, das geht meiner Ansicht nach nicht.
Dazu wirst du am Besten Rx und Tx des µC verwenden mit Pegelwandler 
(MAX232) dazwischen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Anthony Swofford schrieb:
> Aber ich müsste den USB-Programmer doch auch nutzen können um die vom µC
> ausgehenden Daten am Rechner anzeigen zu lassen.
Was verleitet dich zu dieser Annahme?
Hast du einen passenden Betriebssystem-Treiber für das Interface?
Wie empängst du üblicherweise SPI-Daten an deinem PC?

von Oliver J. (skriptkiddy)


Lesenswert?

Anthony Swofford schrieb:
> Aber ich müsste den USB-Programmer doch auch nutzen können um die vom µC
> ausgehenden Daten am Rechner anzeigen zu lassen.
Mit der passenden Firmware sicher. Die wirst du aber selber schreiben 
müssen.

Wenn du am Rechner Daten via SPI empfangen willst, könnte ein Buspirat 
die Lösung sein. Man könnte dann das Bus Pirate SPI sniffer helper 
utility v0.3[1] nehmen.


[1] 
http://code.google.com/p/the-bus-pirate/downloads/detail?name=BusPirate.SPIsniffer.v0.3.zip&can=2&q=

Gruß Oliver

von Oliver J. (skriptkiddy)


Lesenswert?

Hubert G. schrieb:
> Dazu wirst du am Besten Rx und Tx des µC verwenden mit Pegelwandler
> (MAX232) dazwischen.

Seit wann hat ein ATtiny25 denn einen UART? Der hat maximal ein USI, mit 
dem man einen Mix aus Hardware- und Software-UART machen kann[1].

[1] AVR307

von Anthony S. (anthony_02)


Lesenswert?

Ich sehe den USB-Programmer ja als Com-port im Gerätemenager. Und über 
C++ kann ich daten vom COM-Port einlesen und ausgeben. Allerdings 
brauche ich dafür solche Daten wie die Baudrate.

Wenn ich die Daten hätte, müsste ich meiner Meinung nach in lage sein 
die Daten des µC auszulesen.

Im Folgenden wie ich die Daten des µC's über C++ einlesen möchte.
Wie ihr dort sehen könnt muss ich sowas wie die Baudrate Parity etc. 
angeben

------------------------------------------------------------------------ 
--
  //Connect to COM Port + Settings
  AnsiString ASComPort = CB_ComPort->Text;
  std::string csComIntro = ASComPort.c_str();
  std::string csComPort = "\\\\.\\" + csComIntro;
    hSerial=CreateFileA(csComPort.c_str(),GENERIC_READ|GENERIC_WRITE,0,0,OPE 
N_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    if(hSerial==INVALID_HANDLE_VALUE) {B_Connect->Caption = "ERROR_1";}

  memset(&Device,0,sizeof(Device));
  Device.DCBlength       = sizeof(Device);
  Device.BaudRate        = iBaudrate;    // Baudrate
  Device.fParity         = FALSE;
  Device.fBinary         = TRUE;
  Device.Parity          = NOPARITY;// Kein Paritybit
  Device.StopBits        = ONESTOPBIT;
  Device.fOutxCtsFlow    = FALSE;
  Device.fOutxDsrFlow    = FALSE;
  Device.fDtrControl     = DTR_CONTROL_ENABLE;
  Device.fRtsControl     = RTS_CONTROL_ENABLE;
  Device.fDsrSensitivity = FALSE;
  Device.fAbortOnError   = FALSE;
  Device.ByteSize        = 8;       // 8 Datenbits

  if(!SetCommState(hSerial,&Device))
  {
    CloseHandle(hSerial);
    B_Connect->Caption = "ERROR_2";
  }else  B_Connect->Caption = "Disconnect";

    sTo.ReadIntervalTimeout = MAXDWORD; // 0 ms Read-Tomeout
    sTo.ReadTotalTimeoutMultiplier = 0;
    sTo.ReadTotalTimeoutConstant   = 0;
    sTo.WriteTotalTimeoutMultiplier= 1; // 1*2 ms Write Timeout
    sTo.WriteTotalTimeoutConstant  = 2;
    if(!SetCommTimeouts((HANDLE)hSerial,&sTo))
  {
    CloseHandle(hSerial);
    B_Connect->Caption = "ERROR_3";
  }


  AS_Send = "AA";
  WriteFile(hSerial, AS_Send.c_str(), AS_Send.Length(), &dwBytesWritten, 
NULL);
  ReadFile(hSerial, AS_Revieve.c_str(), 256, &dwBytesRead, NULL);
  if(1)
  {
    I_Status->Picture = I_Open->Picture;
  }
------------------------------------------------------------------------ 
--

von Oliver J. (skriptkiddy)


Lesenswert?

Was für einen Programmer/Stick hast du denn? Wie heißt der?

Das wäre wichtig zu wissen, um sagen zu können, ob es eventuell doch 
möglich ist, damit Rohdaten über SPI empfangen.
Ich denke aber, es ist nicht möglich.

Gruß Oliver

von Anthony S. (anthony_02)


Lesenswert?


von Anthony S. (anthony_02)


Lesenswert?


von Sascha W. (sascha-w)


Lesenswert?

Anthony Swofford schrieb:
> Ich habe einen: DIAMEX USB ISP-Programmer für ATMEL AVR, STK500, ATmega
>
> 
http://www.ebay.de/itm/DIAMEX-USB-ISP-Programmer-ATMEL-AVR-STK500-ATmega-/320807196725?pt=DE_Technik_Computerzubeh%C3%B6r_Kabel_Adapter&hash=item4ab1995835

der kann genau das:
- FLASH, EEPROM, Fusebits, Lockbits schreiben, lesen, Chip erase, 
OSCCAL-Register lesen

Auf der seriellen Schnittstelle spricht der ein spezielles 
STK500-Protokoll (kann man sich auch bei Atmel anschauen) und das 
unterstützt keine "SPI-to-COM-Bridge" - wozu auch bei einem Programmer.

Sascha

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.