Skocz do zawartości

ATTiny2313 i ATMega16a - połączenie SPI


Rachel

Pomocna odpowiedź

Witam !

Mam połączone dwa uC interfejsem SPI tak jak na schemacie :

6022936600_1298555714_thumb.jpg

program na ATTiny2313 piszę w BASCOMIE, a na ATMega16a w C, z tego względu, że głównym układem wykonawczym jest ATMega, a ATTiny sluży do operacji właśnie takich jak np odbiór RC5 itp, ale to mało ważne, największym problemem jest to, że podczas symulacji wszystko działa b.dobrze, jednak po zmontowaniu układu na płytce stykowej, Attiny2313 wysyła sygnał, a ATMega16a wogóle na niego nie reaguje, wszystkie połączenia na płytce napewno są poprawne.

Obydwa uC taktowane oddzielnymi rezonatorami 16 MHz ( nie tak jak na schemacie ), połączyłem obydwa uC kablem długości około 10cm.

Zamieszczam jeszcze kody :

Na Attiny2313 :

$regfile "2313def.dat"
$crystal = 16000000

Config Spi = Soft , Din = Pinb.2 , Dout = Portb.1 , Ss = Portb.0 , Clock = Portb.3
Config Rc5 = Pind.2
Config Int0 = Low Level
On Int0 Pobr_rc5

Dim Address As Byte , Command As Byte
Dim OdebrKody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum. As Bit
Dim A(1) As Byte
Enable Interrupts
Enable Int0
Set OdebrKody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.
Do

If OdebrKody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum. = 1 Then
Reset OdebrKody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.
Enable Int0

Spiinit
A(1) = Command
Shift A(1) , Left
Select Case Address
Case 0 : Reset A(1).7
Case 5 : Set A(1).7
End Select
Spiinit

Spiout A(1) , 1
End If
Loop
End
Pobr_rc5:
Disable Int0
Enable Interrupts
'Getrc5(address , Command)
'Command = Command And &B01111111
Set OdebrKody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.
Command = &B00001111;
Address = &B00000101;
A(1) = Command
Shift A(1) , Left
Select Case Address
Case 0 : Reset A(1).7
Case 5 : Set A(1).7
End Select
Spiinit

Spiout A(1) , 1

Return

wiem, że ten kod jest bardzo nie optymalny, ale działa. - nie przepadam za BASCOM-em i stąd taka nieumiejętność pisania w nim.

kod na Atmega16a :

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdbool.h>
#include <util/delay.h>
void init(void)
{
SPCR |= (1<<SPIE) | (1<<SPE)|(1<<CPOL) ;
sei();
DDRD = 0xFF;
DDRC = 0xFF;
}

int main(void)
{
init();
while(1)
{
_delay_ms(100);
PORTC ^= 0x0F;
}
}

ISR(SPISTC_vect)
{
PORTD = (SPDR);// SPSR - rejestr danych
}

Zasada jest prosta, sygnał z RC5, koduję na 7-bitach :

6 bitów - komenda RC5

7 bit - adres RC5 ( wykorzystuje tylko 0 i 5)

następnie przesyłam go do ATmegi16. Na porcie D wyświetlam dane.

Proszę o fachową pomoc.

Link do komentarza
Share on other sites

Tzn. TAk w układzie 2 procesorowym jeden musi być MASTERem a drugi SLAVE. Inaczej nie ma bata aby to zadziałało. Chyba ze spróbujesz zrobić coś na wzór LAN, ale to znowu wymaga protokołu komunikacyjnego i detekcji kolizji na magistrali a SPI raczej się do tego nie nadje, jak już to można to próbować na I2C zrobić.

Kilka linków które mogą ci sie przydać:

http://www.ermicro.com/blog/?p=1050

Notka ATMELa:

http://www.atmel.com/dyn/resources/prod_documents/doc2585.pdf

A.. i ważna rzecz, w obu procach musisz mieć skonfigurowane tak samo SPI, tzn, żeby był ten sam sposób interpretacji sygnałów np. zbocza zegarowego. Ogólnie w SPI są chyba 4 tryby, różniące się miedzy sobą.

Z drugiej strony trzeba by doczytać jakie są wymogi co do szybkości, może za szybko nadajesz do tej ATMegi, no czego używasz w tym TINY2313, sprzętowego USI (w trybie SPI) czy programowego ? Nie wiem czy Bascom dobrze sobie z tym radzi na tym procu. może lepiej to ręcznie pokonfigurować.

Link do komentarza
Share on other sites

Po kolei:

- ATtiny nie jest połączone przez SPI z ATmegą, no chyba, że jest to SPI programowane a nei sprzętowe (masochizm 😉 ale do zrobienia, SPI jest akurat proste jeśli robimy mastera).

- CPOL jeśli załączasz w jednym procku to w drugim obowiązkowo też musisz

-o ile dobrze się połapałem, m16 jest slavem?

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.