Forum: Mikrocontroller und Digitale Elektronik SW-SPI ATTiny13V Max3100


von Lucky (Gast)


Lesenswert?

Hey zusammen,

Ich habe ein Projekt vor mir, mit dem Thema Energy Harvesting.
Dabei soll ich werte eines Sensors am PC ausgeben.
aber meine vorgeschlagen Teile seihen zu verschwenderisch. 
(kty81->atmega8l->max3232->PC).
Ich soll es mit einem ATtiny13V und SPI machen. Ich hoffe das, ich meine 
ersten Hürden Überwältigung habe mit AD-wanlder und software SPI.
Und Die übertragung wollte ich dann mit einem MAX3100 machen der kann ja 
SPI zu UART. Jetzt weiss ich nicht wie ich die configuration schreiben 
soll im Code.
Habt Ihr tipps bzw. hat jemand sowas schon mal gemacht?
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
#include<util/delay.h>
4
5
6
//#define F_CDU 4000000UL
7
//DDRB
8
#define SOFT_SPI_MOSI_DDR  DDRB
9
#define SOFT_SPI_CLK_DDR  DDRB
10
#define SOFT_SPI_MISO_DDR  DDRB
11
//PORTB
12
#define SOFT_SPI_MOSI_PORT  PORTB
13
#define SOFT_SPI_CLK_PORT   PORTB
14
15
//PINB
16
#define SOFT_SPI_MISO_PIN   PB1
17
//BIT
18
#define SOFT_SPI_MOSI_BIT   PB0
19
#define SOFT_SPI_MISO_BIT   PB1
20
#define SOFT_SPI_CLK_BIT    PB2
21
22
23
void SOFT_SPI_init(void)
24
{
25
  // MOSI und CLK auf Ausgang setzen
26
  SOFT_SPI_MOSI_DDR |=(1<<SOFT_SPI_MOSI_BIT);
27
  SOFT_SPI_CLK_DDR  |=(1<<SOFT_SPI_CLK_BIT);
28
29
  // MOSI und CLK auf HIGH setzen
30
  SOFT_SPI_MOSI_PORT|=(1<<SOFT_SPI_MOSI_BIT);
31
  SOFT_SPI_CLK_PORT |=(1<<SOFT_SPI_CLK_BIT);
32
33
  // MISO auf Eingang setzen
34
  SOFT_SPI_MISO_DDR &=~(1<<SOFT_SPI_MISO_BIT);
35
}
36
37
void ADC_INIT(void)
38
{
39
40
  ADCSRA = (1<<ADEN)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); //PB5 AD-Channel
41
  ADCSRA |= (1<<ADSC);
42
}
43
44
unsigned char SOFT_SPI_WriteRead(unsigned char dataout)
45
{
46
  uint8_t datain=0;
47
  //das Byte wird Bitweise nacheinander Gesendet MSB zuerst
48
  for (uint8_t a=8; a>0; a--){                
49
      datain<<=1;                      //Schieben um das Richtige Bit zusetzen
50
      SOFT_SPI_CLK_PORT &=~(1<<SOFT_SPI_CLK_BIT);     // Clock auf LOW
51
                                
52
      if (dataout & 0x80){                //Ist Bit a in Byte gesetzt
53
        SOFT_SPI_MOSI_PORT |=(1<<SOFT_SPI_MOSI_BIT);   //Set Output High
54
      }
55
      else{
56
        SOFT_SPI_MOSI_PORT &=~(1<<SOFT_SPI_MOSI_BIT);   //Set Output Low
57
      }
58
      _delay_us(1);
59
      if (SOFT_SPI_MISO_PIN & (1<<SOFT_SPI_MISO_BIT))   //Lesen des Pegels 
60
        {
61
        datain |= 1;
62
        }
63
64
      _delay_us(1);
65
      SOFT_SPI_CLK_PORT |=(1<<SOFT_SPI_CLK_BIT);       // Clock auf High
66
      _delay_us(2);
67
      dataout<<=1;                     //Schiebe um nächstes Bit zusenden
68
    }
69
70
  return datain;
71
}
72
73
74
75
int main(void)
76
{
77
  ADC_INIT();
78
  SOFT_SPI_init();
79
  SOFT_SPI_WriteRead(ADCW);
80
81
82
  while(1)
83
  {
84
    
85
  }
86
  return 0;  
87
88
}

Ich wollte das Projekt später erweitern mit dem RFM12B, hat der tiny13 
genug speicher oder wirds da eng?

ich danke euch schon mal im voraus
MfG
Lucky

von Lucky (Gast)


Lesenswert?

hat es noch keiner gemacht, wäre echt cool wenn einer ein beispiel 
hätte.

von Peter D. (peda)


Lesenswert?

Niemand, der bei Verstand ist, macht sowas.
Mal mal den Schaltplan auf, dann weißt Du warum.

Nimm nen ATmega48, der ist außerdem deutlich billiger.
Oder nen ATtiny24 und mach die UART in Software.


Peter

von Lucky (Gast)


Lesenswert?

Habe ich gemacht aber, irgendwie sehe ich da kein fehler.
MOSI -> DI
MISO -> DOUT
CLK -> SCLK
Kannst du mir da auf die sprünge helfen?

von Peter D. (peda)


Lesenswert?

Nö, Du brauchst 5 Leitungen (Datenblatt S.23).
Und wieviel IOs bleiben dann vom ATtiny13 übrig?

Und der Preis des MAX3100 ist auch astronomisch.


Peter

von Lucky (Gast)


Angehängte Dateien:

Lesenswert?

klar der MAX3100 hat seinen preis, aber ich muss Ihn ja nicht kaufen. ;)
Und leider der Attiny13 und SPI wurden mir vorgeschrieben.

das man 5 Leitungen braucht habe ich ausser acht gelassen, weil ich 
eigentlich nur Daten senden will, deshalb ging davon aus das ich die 
anderen beiden weg lassen kann.

Ich habe einen anderen code gefunden und für mich passend zu geschrieben 
aber es kommt nichts bei rum, Ich weiss nicht wohin mit dem IRQ.
1
#include<avr/io.h>
2
3
//DDRB
4
#define SPI_MOSI_DDR  DDRB
5
#define SPI_CLK_DDR  DDRB
6
#define SPI_MISO_DDR  DDRB
7
#define SPI_SS_DDR  DDRB
8
//PORTB
9
#define SPI_MOSI_PORT  PORTB
10
#define SPI_CLK_PORT   PORTB
11
#define SPI_MISO_PORT   PORTB
12
#define SPI_SS_PORTB  PORTB
13
// PIN 
14
#define SPI_MOSI_PIN  PB0
15
#define SPI_MISO_PIN  PB1
16
#define SPI_CLK_PIN    PB2
17
#define  SPI_SS_PIN     PB3
18
//MAX3100 
19
#define MAX3100_WRITE_CONFIG  0xC000
20
#define MAX3100_WRITE_DATA    0x8000
21
 
22
void ADC_INIT(void)
23
{
24
ADCSRA = (1<<ADEN)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); //PB5 AD-wandler |(1<<ADLAR)
25
ADCSRA |= (1<<ADSC);
26
}
27
28
void SPI_INIT(void)
29
{
30
  // MOSI, CLK und SS auf Ausgang setzen
31
  
32
  SPI_MOSI_DDR |=(1<<SPI_MOSI_PIN);
33
  SPI_CLK_DDR  |=(1<<SPI_CLK_PIN);
34
  SPI_SS_DDR   |=(1<<SPI_SS_PIN);
35
  
36
  // MOSI, CLK und SS auf HIGH setzen
37
  SPI_MOSI_PORT|=(1<<SPI_MOSI_PIN);
38
  SPI_CLK_PORT |=(1<<SPI_CLK_PIN);
39
  SPI_SS_PORTB |=(1<<SPI_SS_PIN);
40
 
41
 // MISO auf Eingang setzen
42
  SPI_MISO_DDR &=~(1<<SPI_MISO_PIN);
43
}
44
45
unsigned int SPI_Write_Word(unsigned int word)
46
{
47
unsigned char i;
48
unsigned int mask;
49
unsigned int temp;
50
51
SPI_SS_PORTB &= ~(1<<SPI_SS_PIN);  
52
mask = 0x8000;
53
temp = 0;
54
55
for(i=0;i<16;i++)
56
{
57
if(mask & word) SPI_MOSI_PORT|=(1<<SPI_MOSI_PIN); 
58
else SPI_MOSI_PORT&=~(1<<SPI_MOSI_PIN); 
59
if(SPI_MISO_PIN == 1) temp |= mask;
60
SPI_CLK_PORT |=(1<<SPI_CLK_PIN); 
61
SPI_CLK_PORT &=~(1<<SPI_CLK_PIN); 
62
mask >>= 1;
63
}
64
65
SPI_SS_PORTB |= (1<<SPI_SS_PIN); 
66
return(temp);
67
}
68
69
void MAX3100_Write_Config(unsigned int config)
70
{
71
SPI_Write_Word(config); 
72
}
73
74
void MAX3100_Write_Data(unsigned char byte)
75
{
76
unsigned int w;
77
w = (unsigned int)byte | MAX3100_WRITE_DATA ;//w = ADCW | define 0x8000
78
SPI_Write_Word(w);
79
80
while(!(w & 0x4000)); // wait for TX buffer empty
81
}
82
83
int main()
84
{
85
ADC_INIT();
86
SPI_INIT();
87
SPI_Write_Word();
88
MAX3100_Write_Config(MAX3100_WRITE_CONFIG | 0x040B); // 9600,N,8,1, Interrupt + FIFO 
89
MAX3100_Write_Data(ADCW);
90
while(1)
91
{}
92
return 0;
93
}

danke für die Tipps

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.