- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

Thema: Software-SPI-Slave mit Tiny13V

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    21.07.2011
    Beiträge
    27
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Sorry mein fehler habe mich mit der schleife falsch ausgedrückt.

    Klar im slave habe ich keine schleife
    es ist doch in einer schleife die Solange durchlaufen wird bis 16 bit raus geschoben sind.
    damit meinte ich den master-code der in einer Zählschleife ist und 16 mal schiebt.

  2. #12
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von ExKluski Beitrag anzeigen
    Sorry mein fehler habe mich mit der schleife falsch ausgedrückt.

    Klar im slave habe ich keine schleife

    damit meinte ich den master-code der in einer Zählschleife ist und 16 mal schiebt.
    Das beantwortet aber nicht die Frage, was das jetzt mit dem Slave-Code zu tun haben soll? Dort wird nach wie vor nur ein Bit ausgegeben.
    MfG
    Stefan

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    21.07.2011
    Beiträge
    27
    jetzt habe ich es glaube verstanden wie du das meinst. Klar im slave code ist keine schleife also wird auch nur einmal geschoben.

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    21.07.2011
    Beiträge
    27
    Nach längerem grübeln ist der Code entstanden ich würde mich freuen wenn sich jemand durchschaut und auf anhieb fehler erkennt bzw. ob es so richtig ist wie ich es mir vorgestellt habe.

    bei der Warnung bin ich ratlos

    ../spi-tiny13.c:38: warning: suggest parentheses around assignment used as truth value

    weiss aber nichts damit anzufangen.
    Also das Programm soll ein SPI slave simulieren und ADC-werte schicken.
    Am MISO(PB3) werden dann die Pegel Geschaltet,
    Ich bin mir aber nicht Sicher ob der befehl das macht was ich will
    Code:
    while(GIMSK  & (1<<INT0));
    //warte bis am Externen Interrupt etwas passiert
    Und das ist mein ganzer Code
    Code:
    #include <avr/io.h>        // Namen der IO Register
    #include <avr/Interrupt.h> // Interrupt register
    #include "adc-init.h"
    #include "SPI-init.h"
    
    volatile char MISO_Byte;
    volatile int MSB = 0x8000;
    
    ISR(INT0_vect)
    {
    if(MISO_Byte == 1)SPI_MISO_PORT |= (1<<SPI_MISO_PB3); //Pin Miso high
    else SPI_MISO_PORT &= ~(1<<SPI_MISO_PB3);
    }
    
    int main(void)
    { 
       		
      uint16_t adcval;
      ADC_Init();
    /*Externen Interrupt-Init*/
      MCUCR = (1<<ISC01)|(1<<ISC00);
     //Interrupt auslösen wenn Steigende flanke ist
      GIMSK = (1<<INT0);	// Interrupt erlauben
      GIFR  = (1<<INTF0); 
     
    while( 1 ) {
    adcval = ADC_Read(0);  // Kanal 0
    // mach was mit adcval
     
    adcval = ADC_Read_Avg(2, 4);  // Kanal 2, Mittelwert aus 4 Messungen
    // mach was mit adcval
    
    MISO_Byte = MSB | adcval;
      
    if(!(SPI_SS_PIN1 & (1<<SPI_SS_PB1)))// Wenn SS(PB1) auf low geht start der Übertragung
    {
     ==>c35 for(uint16_t a =15 ; a = 0 ; a--)//Warning: suggest parentheses around assignment used as truth value
    {
     if(MISO_Byte & MSB)SPI_MISO_PORT |= (1<<SPI_MISO_PB3);
     else SPI_MISO_PORT &= ~(1<<SPI_MISO_PB3);
     while(GIMSK  & (1<<INT0)); 
    //warte bis am Externen Interrupt etwas passiert
     MISO_Byte<<=1;// Bit nach Links schieben
    }
    }
     else;
    }
       return 0;
    }
    Ich bedanke mich schonmal für die Kritik :P

    MfG Kluski

  5. #15
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    for(uint16_t a =15 ; a < 16 ; a--)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #16
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    1)
    Code:
    if(!(SPI_SS_PIN1 & (1<<SPI_SS_PB1)))
    Da würde ich gerne mal die Definition von SPI_SS_PIN1 sehen.

    2)
    Code:
    for(uint16_t a =15 ; a = 0 ; a--)
    "a = 0" ist eine Zuweisung, kein Vergleich. Aber auch wenn es ein Vergleich wäre, wäre es falsch, denn die Bedingung in einer for-Schleife ist eine "solange"-Bedingung, keine "bis"-Bedingung.

    3)
    Code:
     while(GIMSK  & (1<<INT0));
     //warte bis am Externen Interrupt etwas passiert
    Da muss ich dich jetzt aber mal ernsthaft fragen: wie kommst du nur darauf? Was im Datenblatt lässt dich denken, dass dieses while das machen könnte, was im Kommentar steht?

    4) Und last but not least, warum wird sowohl in einer Schleife in main, als auch in einer ISR etwas auf dem MISO-Pin ausgegeben?
    MfG
    Stefan

  7. #17
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    5) Du willst 16 Bits aus einem Byte ausgeben?
    MfG
    Stefan

  8. #18
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Ich sehe gerade, dass du auch schon einen längeren Thread auf mikrocontroller.net hast. Damit bin ich raus. Ich habe schlicht keine Lust, zwei Threads zu checken, um zu sehen, ob ich meine Zeit nicht damit verschwende, Dinge zu schreiben, die vielleicht längst gesagt wurden.

    Folgendes zum "Abschied":
    Erst musst du dir mal darüber klar werden, ob das eigentliche Raustakten der Daten nun per Interrupt, oder per Polling erfolgen soll, und ob es 8 oder 16 Bit sind. Für 16 Bit Polling sieht der Pseudo-Code dann z.B so aus:
    Code:
    mache 16 mal {
        warte bis Takteingang high
        gebe Bit aus
        schiebe zum nächsten Bit
        warte bis Takteingang low
    }
    MfG
    Stefan

  9. #19
    Neuer Benutzer Öfters hier
    Registriert seit
    21.07.2011
    Beiträge
    27
    zu 1)
    Code:
    //DDRB
    #define SPI_MOSI_DDR  DDRB
    #define SPI_CLK_DDR   DDRB
    #define SPI_MISO_DDR  DDRB
    #define SPI_SS_DDR    DDRB
    
    //PORTB
    #define SPI_MOSI_PORT  PORTB
    #define SPI_CLK_PORT   PORTB
    #define SPI_MISO_PORT  PORTB
    #define SPI_SS_PORT    PORTB
    
    // PIN 
    #define SPI_MOSI_PIN0  PINB0
    #define SPI_SS_PIN1    PINB1
    #define SPI_CLK_PIN2   PINB2
    #define SPI_MISO_PIN3  PINB3
    //PB
    #define SPI_MOSI_PB0  PB0
    #define SPI_SS_PB1    PB1
    #define SPI_CLK_PB2   PB2
    #define SPI_MISO_PB3  PB3
    
    //Slave-deklaration
    void SPI_INIT(void)
    {
    // MOSI, CLK und SS auf Eingang setzen
      SPI_MOSI_DDR = (1<<SPI_MOSI_PB0);
      SPI_CLK_DDR  = (1<<SPI_CLK_PB2);
      SPI_SS_DDR   = (1<<SPI_SS_PB1);
    // MOSI, CLK und SS Internen Pull-Up aktivieren 
      SPI_MOSI_PORT |=(1<<SPI_MOSI_PB0);
      SPI_CLK_PORT  |=(1<<SPI_CLK_PB2);
      SPI_SS_PORT   |=(1<<SPI_SS_PB1);
    // MISO auf Ausgang setzen 
      SPI_MISO_DDR |= (1<<SPI_MISO_PB3);
    //MISO auf High setzten
      SPI_MISO_PORT |= (1<<SPI_MISO_PB3);
    }
    zu 2) Mein fehler geändert in
    Code:
    for(uint16_t a =15 ; a > 0; a--)
    zu3) Kennst du das nicht im Kopf Klang es logisch, eigentlich wollte ich damit erreichen das er an der stelle warten soll bist der externe Int0 ausgelöst wird.

    zu4) Ne es soll nur etwas am miso-pin passieren wenn der der interrupt ausgelöst wird.

    zu5) es werden 16-bit ausgegeben habe es nur byte genannt.

    MfG Kluski

  10. #20
    Neuer Benutzer Öfters hier
    Registriert seit
    21.07.2011
    Beiträge
    27
    zu1 ) Bitte
    Code:
    //DDRB
    #define SPI_MOSI_DDR  DDRB
    #define SPI_CLK_DDR   DDRB
    #define SPI_MISO_DDR  DDRB
    #define SPI_SS_DDR    DDRB
    
    //PORTB
    #define SPI_MOSI_PORT  PORTB
    #define SPI_CLK_PORT   PORTB
    #define SPI_MISO_PORT  PORTB
    #define SPI_SS_PORT    PORTB
    
    // PIN 
    #define SPI_MOSI_PIN0  PINB0
    #define SPI_SS_PIN1    PINB1
    #define SPI_CLK_PIN2   PINB2
    #define SPI_MISO_PIN3  PINB3
    //PB
    #define SPI_MOSI_PB0  PB0
    #define SPI_SS_PB1    PB1
    #define SPI_CLK_PB2   PB2
    #define SPI_MISO_PB3  PB3
    
    //Slave-deklaration
    void SPI_INIT(void)
    {
    // MOSI, CLK und SS auf Eingang setzen
      SPI_MOSI_DDR = (1<<SPI_MOSI_PB0);
      SPI_CLK_DDR  = (1<<SPI_CLK_PB2);
      SPI_SS_DDR   = (1<<SPI_SS_PB1);
    // MOSI, CLK und SS Internen Pull-Up aktivieren 
      SPI_MOSI_PORT |=(1<<SPI_MOSI_PB0);
      SPI_CLK_PORT  |=(1<<SPI_CLK_PB2);
      SPI_SS_PORT   |=(1<<SPI_SS_PB1);
    // MISO auf Ausgang setzen 
      SPI_MISO_DDR |= (1<<SPI_MISO_PB3);
    //MISO auf High setzten
      SPI_MISO_PORT |= (1<<SPI_MISO_PB3);
    }
    zu 2) mein fehler
    Code:
    for(uint16_t a =15 ; a > 0; a--)
    zu3) Kennst du das nicht auch im Kopf Klang es Logisch damit meine ich er soll warten bis der Interrupt ausgelöst.

    zu4) da wusste ich nicht wie ich das schreiben sollte. Ich will das er ein bit am MISO aus gibt wenn der Interrupt ausgelöst wird und ein bit weiter schiebt

    zu5) er heisst nur Byte damit ich weiss es sind mehre bits

    MfG Exkluski

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Ähnliche Themen

  1. Slave-Master-Slave übertragung geht nicht
    Von Dämmi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 26.11.2008, 00:08
  2. Software-Slave für I2C-Bus
    Von ZellRobi im Forum Software, Algorithmen und KI
    Antworten: 11
    Letzter Beitrag: 25.06.2008, 15:59
  3. Problem beim Programmieren bei minimaler Taktung Tiny13V
    Von Windi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 11.09.2007, 14:02
  4. Bezugsquelle für Tiny13V
    Von Windi im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 20.02.2006, 22:30
  5. AT90S2313 als I2C-Slave (Software-Implementierung)
    Von talentraspel_kai im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 08.02.2006, 15:03

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test