C Problem mit SPI

merzi1993

Neues Mitglied
19. Mai 2012
16
0
0
Österreich
Sprachen
  1. BascomAVR
  2. ANSI C
Hallo!

Ich wollte mich mal in das Thema SPI einarbeiten und Daten über SPI senden... :confused:

Daten:
µC: Atmega48
F_CPU: 3686400Hz
MyAvr MK2 Board

Durch einen Tastendruck, welcher Interruptgesteuert ist, soll über SPI etwas gesendet werden.

Dazu habe ich folgendes Programm geschrieben:

sbi dient dazu ein Bit zu setzen (funktioniert auch einwandfrei) - sbi wurde in global.h definiert

Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "global.h"

#define F_CPU 3686400UL

int main(void)
{
	//Int1 = Input
	sbi(DDRD,3);
	sbi(PORTD,3);
	
	//Output für LED
	sbi(DDRC, 0);
	
	SPI_Init();
	Interrupt_Init();

	sei();
	
    while(1)
    {
    }
}

ISR(INT1_vect){
	SPI_Send_Char(65);	
	
}

void Interrupt_Init(){
	sbi(EICRA, ISC11);
	sbi(EIMSK, INT1);
	sbi(EIFR, INTF1);
}

void SPI_Init(){
	sbi(SPCR, SPE);
	sbi(SPCR, MSTR);	
	sbi(SPCR, SPR0);
}

void SPI_Send_Char(unsigned char cData){
	SPDR = cData;
	while(!(SPSR & (1 << SPIF)));
}

Es wird überhaupt nichts gesendet. SCK und MOSI stehen permanent auf LOW.
Mir kommt vor als würde ich bei der Warteschleife in SPI_Send_Char stecken.
Worin könnte hier das Problem liegen?

Gruß
Mathias
 
Hallo Mathias,

du setzt das Bit 3 im DataDirectionRegister DDRD. Der Pin PD3 ist somit ein Ausgang und auf High, da das Bit 3 im Port-Register ebenfalls gesetzt ist.

Dirk
:ciao:

sbi(DDRD,3);
sbi(PORTD,3);
 
Hallo Dirk,

das mit Bit 3 im DDRD ist schon richtig, aber das ist die Datenrichtung für den Interrupt-Pin. Ich habe somit das Bit 3 im DDRD geändert, aber es werden noch immer keine Daten gesendet. :confused:

Nun habe INT1 aus dem Programm genommen und es soll nun nur noch durchgehend etwas über SPI gesendet werden. Funktioniert noch immer nicht. :confused:

Programm dazu:
Code:
#define F_CPU 3686400UL
#include <avr/io.h>
#include <avr/delay.h>
#include "global.h"

int main(void)
{	
	//Output für LED
	sbi(DDRC, 0);
	
	SPI_Init();

	
    while(1)
    {
		SPI_Send_Char(65);
	}		

}


void SPI_Init(){
	sbi(DDRB, 3);
	sbi(DDRB, 5);
	sbi(SPCR, SPE);
	sbi(SPCR, MSTR);	
	sbi(SPCR, SPR0);
}

void SPI_Send_Char(unsigned char cData){
	SPDR = cData;
	while(!(SPSR & (1 << SPIF))){
		sbi(PORTC,0);
		_delay_ms(500);
		cbi(PORTC,0);
		_delay_ms(500);
	}
}

Ich bin zum Entschluss gekommen, dass ich in der while-Schleife hängen bleibe. Also toggle ich in dieser Schleife alle 500ms ein Bit. Und tatsächlich ist es auch so. Das Bit toggelt alle 500ms - ich hänge in dieser Schleife fest. Warum ist das so?


EDIT:
Das Problem lag daran, dass bei meinem Board der Datenmodus aktiviert werden muss, damit es funktioniert. ;)
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)