Hur ska jag komma igång?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur ska jag komma igång?

Inlägg av sodjan »

OK, hittade det nu...
SL ("SLeep" ?) kallas även CS ("Chip Select") i databladet... :roll:
Jag såg så klart bara CS när jag kollade...

Hur som helst...

En tips bara...
Du sparar *massor* av jobb om du skaffar en processor med inbyggd USART.
Programvaru USART är lite 80-tal...
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Hur ska jag komma igång?

Inlägg av jesse »

Jovisst, det kanske är lite 80-tal, men jag tänkte nog att det skulle finnas färdig assember-kod att kopiera som sköter bit-bangandet. Egentligen är det inte mycket svårare än att blinka med en lysdiod, fast man måste ha lite mer koll på tiden.

...fortsätter från min paus...

exempel: 8 MHz, 9600 BAUD:

När sista biten lästs in från UART (och du skippar att läsa stoppbiten) så har du mer än en bits tid på dig (1.5 bit ungefär) att spara en byte i RAM innan nästa startbit kommer.

Du läser av en bit var 104:e mikrosekund. Det blir 833 instruktioner om du kör med 8 MHz. Så vid sådana hastigheter är det bara i extrema fall man inte hinner med (om man ska göra beräkningar mellan varje inläst databyte, t.ex.)

Jag Googlade på AVR assembler uart och fick bland annat fram:

How to Setup Half-Duplex UART (AVR ASM) <- Här får du källkoden färdig direkt.

Kod: Markera allt

;**** A P P L I C A T I O N   N O T E   A V R 3 0 4 ************************
;*
;* Title:  Half Duplex Interrupt Driven Software UART 
;* Version:  1.0
;* Last updated:	97.07.18
;* Target:  AT90Sxxxx (All AVR Devices)
;*
;* Support E-mail:	avr@atmel.com
;*
;* Code Size  :72 words
;* Low Register Usage	:2
;* High Register Usage	:5
;* Interrupt Usage	:External Interrupt,
;*    Timer/Counter0 overflow interrupt
;*
;* DESCRIPTION
;*
;* This application note describes how to make a half duplex software UART
;* on any AVR device with the 8-bit Timer/Counter0 and External Interrupt.
;* As a lot of control applications communicate in one direction at a time
;* only, a half duplex UART will limit the usage of MCU resources.
;*
;* The constants N and R determine the data rate. R selects clock frequency
;* as described in the T/C Prescaler in the AVR databook. If the T/C pre-
;* scaling factor is denoted C, the following expression yields the data rate:
;*
;*   XTAL
;*  BAUD = ------  min. N*C = 17
;*   N*C  max. N   = 170
;*
;* Absolute minimum value for N*C is 17 (which causes the interrupt flag to be 
;* set again before the interrupt is finished). Absolute maximum is 170.
;* (Caused by the 1.5bit-lenght that is necessary to receive bits correctly.)
;*
;* The UART uses PD2 as receive pin because it utilizes the external interrupt.
;* The transmit-pin is PD4 in this example, but it can be any other pins.
;*
;* Since the UART is half duplex, it can either send or recieve data. It can't
;* do both simoutaneausly. When idle it will automatically recieve incoming
;* data, but if it is transmitting data while incoming data arrives, it will
;* ignore it. Also, if u_transmit is called without waiting for the 'READY' bit
;* in the 'u_status' register to become cleared, it will abort any pending 
;* reception or transmittal.
(Jag tog bara med kommentarsfältet. Hela koden finns i länken ovan)

(Teorin bakom programmet finns beskriven i Atmel Application note AVR 304)


Nu har faktiskt ATtiny26 en enhet som heter USI - Universal Serial Interface, som kan användas som UART. Tyvärr är den allt annat än smidig att använda och jag har aldrig lyckats begripa hur jag använder den, trots att Atmel har en egen "applicaton note" om hur man kör UART med USI. (AVR 307)
noshorning
Inlägg: 54
Blev medlem: 18 februari 2011, 20:00:34

Re: Hur ska jag komma igång?

Inlägg av noshorning »

Jag måste ju ändå köpa en nivåomvandlare insåg jag nu. Så då kan jag ju köpa en ATtiny461 samtidigt, eller ngn annan som har uart redan. Jag kommer även behöva köpa någon form av sensorer till dammsugar projektet också. Någon form av en sådan där ir-mottagare och en ir-led som jag kan koppla mot en sådan 555-timer för att blinka i korrekt frekvens (vi gjorde något liknande i gymnasiet men i form av ett inbrottsalarm istället, men principen bör ju kunna användas här också). Hur som helst så behöver jag ändå köpa lite grejer så det kanske är dags att göra det nu.

Men jag tror att jag ska testa att även lösa det med 26an. Jag kommer då försöka skriva koden själv, både för att det skulle kunna vara lärorikt, jag har ju inte jobbat med timern något osv. Även för att jag av någon outgrundlig anledning gillar just den AVR-modellen. Det har ju i princip blivit min först mikroprocessor jag någonsin jobbat med (jag må ha programmerat in ngt litet assembler program i skolan med någon random pic-processor i gymnasiet, men det räknas inte).

Men tack alla, nu vet jag hur jag ska gå vidare i allafall.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Hur ska jag komma igång?

Inlägg av jesse »

Men Attiny461 har ju inte heller någon UART !!! (P Hermanson har nog chansat och gissat lite när han skrev det :eh: )

Välj en ATmega (med UART - kolla det innan du köper) exempelvis ATmega88 eller 168. Eller varför inte något rejält med en gång - en ATMega644A. Det finns Attiny med UART, t.ex Attint2313A eller 4313, men tänk på att du ska ha gott om plats i flashminnet också. 4Kbyte är i minsta laget om man ska göra något mer än bara blinka lysdiod. (Nu kanske du ska köra med hålmonterade kapslar (DIP), annars rekommenderar jag TQFP som är smidiga och tar väldigt litet utrymme på kretskortet och går ändå enkelt att löda för hand. Dessa förutsätter dock att du etsar eller beställer egna kretskort.

555:an håller inte frekvensen särskilt stabilt (antar jag?), dvs. mycket stor risk att den börjar driva i frekvens med tiden så att kommunikationen slutar att fungera. Använd en krets som drivs av en kristall. En utgång från en AVR-processor borde fungera utmärkt - man kan ställa in en timer att skicka ut en fast frekvens. vad brukar det vara? 36kHz?

>Men jag tror att jag ska testa att även lösa det med 26an. Jag kommer då försöka skriva koden själv, både för att det skulle kunna vara lärorikt, jag har ju inte jobbat med timern något osv.
Trevlig inställning :)

Så här ser min UART-rutin ut för Attiny26 (från 2009): ladda ner zip-fil
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: Hur ska jag komma igång?

Inlägg av dangraf »

Har du funderat på att skaffa en utvecklingsmiljö för t.ex stm32. Då får du inbyggd uart + allt annat du kommer behöva. Du slipper lära dig en nu arkitektur när du växt ur avr /pic eller vad du nu väljer. Dessutom kommer du ha en stor fördel på arbetsmarknaden eftersom det inte är så många nya utvecklingsprojekt som startar med 8 el 16 bitars processorer. Jepp, det kan ev bli en lite längre startsträcka att få utvecklingsmiljön att fungera.

Bitbanga i baud 9600?? ja, det kan man göra om man inte har något bättre att lägga fritiden på men för mig känns det bara dumt. Då offrar du en uc som knappt kan göra något annat än att skicka data. Interrupt-rutiner eller andra bakgrundsprocesser kan lätt störa överföringen. lägg tiden på något viktigare/roligare istället t.ex förstå hur processorn fungerar, vilka möjligheter som finns, leta efter referensprojekt som du kan utgå från, modifiera så att du kan göra det du egentligen vill.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: Hur ska jag komma igång?

Inlägg av dangraf »

För att det hela ska bli rätt tror jag att det skulle vara bra att tänka genom vilka mål du har.
enligt inlägg 1 vill du bygga om en damsugare och en radiobil till en radiostryrd dammsugare? Du nämner även att du läst lite ellära och elektronik vilket jag tycker tyder på att detta är ett område som du skulle vilja arbeta inom i framtiden.

Bygga om damsugaren är en bra bit på vägen! Skapar intresse och kul projekt att komma igång med!

Vad vill du att damsugaren ska kunna göra?
1. stänga av/på damsugningen.
2. kunna köra med damsugaren, höger och vänster motor?
3. kunna känna av om den krockar med något ev en eller flera avståndssensorer.
4. kunna styra över radio.
5. lätt kunna debugga kortet som sitter på damsugaren för att hitta fel / problem etc.
6. möjlighet lite andra roliga sensorer t.ex sugflöde i röret, typ av underlag hitta tillbaka till laddstation etc.

Om man ska ta i från tårna för att definiera vad som behövs för att uppfylla kraven resonerar jag såhär:

krav 1: en PWM utgång för att styra en mosfet så att man kan styra styrkan på sugningsförmågan. Ev även mäta strömmen genom transistorn så att man upptäcker om motorn går på högvarv el inte. Kanske även en läsgaffel för att mäta hastigheten på fläkten..
krav2 : 2st motorstyrningar som oftast brukar bestå av PWM utgångar (precis som ovan) med för att mäta hur långt hjulen snurrat (så att man får damsugaren att köra rakt) och även strömavkänning till motorerna.

Krav3: ett gäng digitala IO ingångar och ev ett gäng AD kanaler.

krav4: kommunikation med en radiokrets. oftast brukar man kunna prata med dessa genom spi i2c seriall (typ rs232) eller paralell interface. ytterligare IO kan behövas för att styra chip-select, om man sänder eller tar emot, signalstyrka etc.

krav5: ev en uart eller USB (eftersom det börjar bli svårt att hitta datorer med serie-interface) kanske möjlighet till en display som kan visa vad som hänt.

krav6: lediga iopinnar och programmminne för att kunna implementera ytterligare funktionallitet.

--------------------------------------------------------------------------------------------------
Jag har säkert glömmt en massa detaljer som behöver tilläggas.
Jag försöker bara visa att det kanske är dumt att satsa på en ATtiny med begränsat med minne och interface eftesom det finns så mycket möjligheter att bygga ut ditt system. Jag misstänker att du inte vill bygga ett nytt kretskort och skriva om koden för varje uppgradering?

Min rekomendation är att du köper ett färdigt utvecklingskort med en mcu på 32 bitar (då har du kunskapen till godo i framtiden vilket är en stor fördel) som har ett färdigt uart-interface, inbyggt programmeringsgränssnitt, usb interface och en massa minne. gärna en display och det viktigaste av allt, kontakter så att du lätt kan koppla in dig på io-pinnarna på processorn. Köp ett kopplingsdäck eller experimentplatta som du löder / virar / trycker i dina komponenter du vill använda och fäst fast hela schabraket på dammsugaren.

gör så enkelt som möjligt i böjan, kanske räcker det med 3st reläer för att styra hjul och sugförmåga samt några knappar som avkänningssensorer och något enkelt för att prata med radion. Skippa radion helt i första skedet kanske?

ladda ner programmexempel och utgå från dessa, se hur koden är uppbyggd, hur man använder sig av interrupt-rutiner, DMA etc för att kunna köra så många processer paralellet utan att själva CPUn behöver jobba. Sen bygger du vidare på detta.

Om du börjar harva med att bit-banga uart interface och skriva dessa i assembler misstänker jag att kommer få din dammsugare att fungera nångång nästa sekel :-)
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Hur ska jag komma igång?

Inlägg av Swech »

Det är å andra sidan inte dumt att börja med en enklare processor innan man kör på med 32 bitars
Det finns tillräckligt med kraft för att köra en dammsugare i en 8 bitars..

Ta mindre steg i början, blinka med en lysdiod

Swech
noshorning
Inlägg: 54
Blev medlem: 18 februari 2011, 20:00:34

Re: Hur ska jag komma igång?

Inlägg av noshorning »

Tack för alla kommentarer och rekommendationer.

Dangraf du har rätt i att jag vill jobba med elektronik i framtiden, jag har ju precis läst mitt första år på en civilingenjörsutbildning inom mikroelektronik. Jag kommer förmodligen lära mig mycket av detta lite senare i utbildningen, men det är ju inte fel att tjuvstarta och vara lite förberedd.

Jag har även tänkt i de banorna du pratar om(alltså när det gäller att lägga upp mål osv, inte själva utvecklingsformen för 32bitars processorer).

Jag har beställt en Atmega168 som jag nu tänkte använda till detta projektet. Jag funderar sen på att styra det mesta från någon program skrivet i ett högnivåspråk, typ java eller kanske c++, direkt i datorn till en början. Det jag skriver till microprocessorn i assembler handlar enbart om att ta mot signaler från datorn som säger åt roboten hur den ska åka(alltså svänga höger,vänster, backa eller åka framåt). Även att skicka signaler till datorn från sensorerna.

Jag kommer bygga 4st ir-sensorer. En på vardera sida av bilen som består av en ir-lysdiod och en ir-motagare som läser frekvens på 38kHz. Jag kommer använda en utgång och den inbyggda timern hos 168an för att ge ut en frekvens på 38kHz till ir-lysdioderna.

Första steget när jag får grejerna jag beställt är att försöka få datorn att kommunicera med 168an på en kopplingsplatta. Sedan ska jag tända/släcka lysdioder som motsvarar svänga, backa och åka framåt. Jag kommer även bygga upp sensorerna och försöka skicka informationen från dem till datorn. När jag lyckats med det så har jag ju mekaniken och det från min redan existerande radiobil. Då kan jag koppla in allting till den och börja köra den från datorn. Jag kan sedan programmera resten i ett lämpligt högnivåspråk på datorn. Det är så jag tänker just nu. Sedan om jag vill göra mer avancerade grejer som att kunna ändra hastigheten på bilen, dammsugaren osv så är det senare problem som jag kan ta tag i om några veckor när detta är klart och fungerar.

När jag kommit upp med en vettig algoritm i java(eller c++) på hur man bäst dammsuger ett rum så kan jag överväga om det är värt att skriva det programmet till mikroprocessorn eller om jag låter styra allting från datorn... Jag tänker som du säger att en sådan algoritm kan bli lite lätt komplicerad att skriva i assembler. Men om jag gör den i java först och optimerar den så mycket det går så kanske det är möjligt att skriva om den i assembler.

När det handlar om att docka roboten till en laddningstation osv så har jag lite planer på hur jag ska göra det också men detta inlägget kommer bli en halv bok om jag ska berätta alla tankar jag har, eftersom jag har väldigt många :P
noshorning
Inlägg: 54
Blev medlem: 18 februari 2011, 20:00:34

Re: Hur ska jag komma igång?

Inlägg av noshorning »

Hej alla igen.

Jag har köpt några SFH 5110-38 och IR333A. Men får dem inte alls att fungera som jag vill. Har även blivit osäker på om SFH 5110-38 ens är menad att kunna användas som en sensor på det här sättet.

Jag vill som sagt bara att en lys-diod ska tändas då ir-mottagaren tar mot signaler och släckas då ir-mottagaren inte tar mot signaler.

För tillfället testar jag med en attiny13. Mitt första problem var att få reda på vad den inre klockfrekvensen är. Har lite problem att hitta den i databladet. Men det verkar som om den är på 9,6MHz?

Jag skrev denna kod:

Kod: Markera allt

.INCLUDE "TN13DEF.INC"   
	.DEF A = R16             

	.ORG 0000
	    RJMP ON_RESET       
	.ORG 0003
	    RJMP TIM0_OVF 

	ON_RESET:
	    SBI DDRB,0           ;SET PORTB0 FOR OUTPUT
		SBI DDRB,2

		CBI DDRB,1
	    LDI A,0b0000_0001    ;no prescaling     
	    OUT TCCR0B,A         ;TIMER/COUNTER CONTROL REGISTER "B"
	    LDI A,0b0000_0010    ;ENABLE TIMER-OVERFLOW INTERUPT
	    OUT TIMSK0,A
		LDI A,3			 ;PRELOAD THE TIMER
	    OUT TCNT0,A
	     SEI                 ;ENABLE INTERUPTS GLOBALLY
    

	MAIN_LOOP:
	     SBIS PINB,1 
		 SBI PORTB,2 ;turn of led

		 SBIC PINB,1
		 CBI PORTB,2 ;turn on led

	       RJMP MAIN_LOOP


	TIM0_OVF:
	      SBI   PINB,0       ;FLIP THE 0 BIT
	       RETI
Ir-dioden, är kopplad till PORTB0
SFH 5110-38, till PORTB1
en vanlig led till PORTB2

Jag tycker jag fått till matten: (9,6*10^6)/(255-3)=38,095KHz

Så kan man använda den på det sättet jag trodde? Har jag räknat med rätt klockfrekvens? Varför fungerar ingenting för? :( Just nu ger den bara ifrån sig en hög nivå hela tiden. Alltså att den inte hittar någon ir strålning i rätt frekvens antar jag.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Hur ska jag komma igång?

Inlägg av Swech »

Dra ned frekvensen rejält och sätt en vanlig lysdiod på utgången
så kan du verifiera att det blinkar

HAr du sett ett lite blåaktigt sken från din IR diod? det betyder isåfall att den
lyser/blinkar

Har du testat med en vanlig fjärr och tryckt på någon knapp och se om det reagerar?

Swech
noshorning
Inlägg: 54
Blev medlem: 18 februari 2011, 20:00:34

Re: Hur ska jag komma igång?

Inlägg av noshorning »

Jag gjorde det nu, Delade timern på 1024 och blinkade på varje overflow.

Alltså om frekvensen är 9,6MHz betyder det att den skulle ha fått frekevensen: 9,6*10^6/(255*1024)=36,8Hz. Men dioden blinkar inte så snabbt tycker jag, utan kanske 2-3ggr per sekund skulle jag gissa. Alltså känns det som att 9,6MHz är ca 10 ggr för snabbt mot verkligheten... Är det det som är den inre frekvensen för en attiny13? Jag har svårt att hitta i databladet. :P
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur ska jag komma igång?

Inlägg av sodjan »

> Är det det som är den inre frekvensen för en attiny13?

Det beror ju på hur du har ställt in den (processorn).

> Jag har svårt att hitta i databladet.

Allt som du behöver kring detta borde vara i t.ex :
"6. System Clock and Clock Options"
"6.2 Clock Sources"
"6.2.2 Calibrated Internal 4.8/9.6 MHz Oscillator"
"6.2.4 Default Clock Source"

Vad är det som du nte hittar?
noshorning
Inlägg: 54
Blev medlem: 18 februari 2011, 20:00:34

Re: Hur ska jag komma igång?

Inlägg av noshorning »

Det beror ju på hur du har ställt in den (processorn).
Well, jag har inte ställt in någonting... :humm:
Vad är det som du nte hittar?
Som jag sa, jag hittar inte riktigt vad den inre frekvensen är. Det står på sida 25 att den är 9,6 eller 4,8MHz. Jag förstår inte vad som avgör skillnaden. Jag har dock provat med att skala frekvensen till ir-dioden från bägge dessa frekvenser, men det fungerade inte med 4,8 heller.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur ska jag komma igång?

Inlägg av sodjan »

> Well, jag har inte ställt in någonting...

"6.2.4 Default Clock Source".

> Jag förstår inte vad som avgör skillnaden.

"6.2.2 Calibrated Internal 4.8/9.6 MHz Oscillator".
"Table 6-4. Internal Calibrated RC Oscillator Operating Modes"
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Hur ska jag komma igång?

Inlägg av Swech »

clkdiv 8 är programmerad som default (FUSE bit)
så du har 9.6MHz / 8 som intern klocka , vilket även du ser på ditt blink
Ändra detta så funkar det säkert

Swech
Skriv svar