Daten des ATTiny24 über SPI auslesen

OP #2453420
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?
#2454279
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
OP #2454298
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;
  }
------------------------------------------------------------------------ 
--
#2454340
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

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