MCU boards - test og udvikling

Timer interrupt i UNO boardArduino UNO

Posted by Ole Bent Nielsen Fri, February 13, 2015 18:38:54

Jeg har lavet en lille demo her på hvordan timer interrupt kan gøres på et UNO board.

Bemærk at den timer der bruges, somme tider anvendes i andre biblioteker, så det skal vi lige være opmærksomme på.
Jeg har fået inspiration fra denne side http://letsmakerobots.com/content/arduino-101-timers-and-interrupts , som giver et godt overblik over de funtioner der er til rådighed.

Kodestumpen er sakset på nettet og modificeret til demo. Ikke det store program; men det viser funktionen, så der er noget at gå videre med.
Timer interrupt er jo meget nyttige, når ting skal ske med bestemte intervaller, som f.eks. timebase o.lign.

------------ her er koden til at klippe ud og sætte i Arduino compileren -----------

/* Denne kode er sakset og modificeret så der tælles og udlæses hvert sekund
da det er en 500 mSec timer interrupt skal der tælles op med 2 for hver ganf der skrives ud
til terminalvinduet
OZ8NZ, Ole den 13.02.2015
*/
/*
Example Timer1 Interrupt
Flash LED every second
*/
#define ledPin 13
int cnt = 0 ; /* counter fra interupt */
int timer1_counter;
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
// initialize timer1
noInterrupts(); // disable all interrupts
TCCR1A = 0;
TCCR1B = 0;

// Set timer1_counter to the correct value for our interrupt interval
//timer1_counter = 64886; // preload timer 65536-16MHz/256/100Hz
//timer1_counter = 64286; // preload timer 65536-16MHz/256/50Hz
timer1_counter = 34286; // preload timer 65536-16MHz/256/2Hz

TCNT1 = timer1_counter; // preload timer
TCCR1B |= (1 << CS12); // 256 prescaler
TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt
interrupts(); // enable all interrupts
}

ISR(TIMER1_OVF_vect) // interrupt service routine
{
TCNT1 = timer1_counter; // preload timer
digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
++cnt; /* add 1 ved interrupt */
}

void loop()
{
delay(1000);
Serial.print(" Counter har talt til ");
Serial.println(cnt);
if (cnt >= 100) /* Reset counter hvis > end = 100 */
{
cnt =0;
}
}





Demo af interrupt funktionArduino UNO

Posted by Ole Bent Nielsen Thu, February 12, 2015 18:59:57

Her er et lille test setup, til demo af hvordan interrupt kan gøres på et Arduino UNO board, samme funktioner kan bruges på Mega boardet, som har flere indgange til interrupt. UNO board har kun 2 indgange der kan bruges. Der kan ses meget mere i dokumentationen til Arduino.

Følgende er et lille program der kan vise interrupt funktionen på et UNO board

/* Simpel demo af interrupt funktion til Arduino uno board
Interrupt input er digital pin 2, interrupt her er ved skift af status på pin
der er indsat en counter som kan læses vha af debug terminal, hver gang der er talt til
100 resettes counter til 0

Test gøres ved at sætte "pullup" på pin 2 f.eks. 220 ohm, hvorefter pin 2 lægges til 0 for at tælle
Bemærk at der når der testes kan blive mere end en værdi højere for hver læsning, selv
om status ikke ændres, dette skyldes at der er "prell" i den forbindelse der lægges til
0, det er derfor vigtigt at sørge for ikke at få mere end 1 puls hvis dette skal bruges til
andet end en demo.

Interrupt kan være på følgende state
LOW to trigger the interrupt whenever the pin is low,
CHANGE to trigger the interrupt whenever the pin changes value
RISING to trigger when the pin goes from low to high,
FALLING for when the pin goes from high to low.

OZ8NZ den 12.02.2015

*/

int pin = 13;
volatile int state = LOW;
volatile int cnt = 0 ; /* counter fra interupt */

void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE); /* Digital pin 2 */
Serial.begin(9600);
}

void loop()
{
delay(500);
digitalWrite(pin, state);
Serial.print(" Counter har talt til ");
Serial.println(cnt);
if (cnt >= 100) /* Reset counter hvis > end = 100 */
{
cnt =0;
}
}

void blink()
{
state = !state;
++cnt; /* add 1 ved interrupt */
}



IO port definitioner til vores projektArduino UNO

Posted by OZ8NZ Ole Thu, March 06, 2014 16:31:03

I forbindelse med vores planlægning af vores Arduino projekt med display og styring af en CQP4000 syntese er det besluttet at vi bruger følgende definitioner til IO porte.
Dette for at vi har det samme grundlag til programmering, når vi når dertil

Arduino CQP4000 Display Beskrivelse
D0 ----> -------------------------------> Rx seriel
D1 ----> -------------------------------> TX seriel
D2 ----> A0 ---> D7 A0 CQP 4000 / D7 på display
D3 ----> A1 ---> D6 A1 CQP 4000 / D6 på display
D4 ----> A2 ---> D5 A2 CQP 4000 / D5 på display
D5 ----> D0 ---> D4 D0 CQP 4000 / D4 på display
D6 ----> D1 D1 CQP 4000
D7 ----> D2 D2 CQP 4000
D8 ----> D3 D3 CQP 4000
D9 ----> St strobe til CQP4000
D10 -> -----------------------------> GPS seriel ind
D11 -> ---> E Display Enable
D12 -> ---> Rs Display Read / Write
D13 -> -----------------------------> LED på Arduino Board

A0
A1
A2
A3
A4 ---------------------------------------> SCL --> I2C
A5 ---------------------------------------> SDL --> I2C





Program struktur i Arduino C programArduino UNO

Posted by OZ8NZ Ole Mon, February 17, 2014 14:01:41

Jeg har gjort mig lidt tanker om hvordan det er nemmest at komme i gang med at kode program til en Arduino i C, som der jo programmeres i og har derfor lavet dette lille program som viser strukturen og de elementer der indgår, for at få kompileren til at oversætte programmet til kode som kan køres på et Arduino board.

Der er mange fordele ved at strukturere et program. Der giver bl.a. den fordel at koden bliver mere overskuelig, hvis der senere skal rettes, for at bruge den til andre formål. Det er ment at lave små funktioner som kan afprøves og som kaldes hvis funktionen skal bruges mange gange i programmet, hvor vi er sikre på at den virker hver gang.

Når koden brydes op i funktioner og andre små programdele er det også med til at optimere koden som lægges i Arduinoen, da der så kun er kode en gang, som kan bruges mange gange og derfor sparer plads i MCU'en

Dette er en måde at gøre det på, og der er sikkert andre, som har andre forslag til hvordan det kan gøres.

Grunden til at jeg synes dette er en god måde at gøre det på er at koden til de enkelte funktioner er defineret øverst i programmet og findes inden vi kommer ned på det sted i programmet, hvor de anvendes ( måske et levn fra mine pascal dage ) , og det er absolut ikke nødvendigt at gøre sådan, da alle funktioner og små program stumper og kan lægges nederst, hvis man synes bedre om den struktur.

Programmet som jeg har brugt til at vise strukturen er her under, så jeg håber med dette at have givet lidt inspiration til dem som aldrig har programmeret til en Arduino, og som ingen erfaring har med at programmere i C

Har i spørgsmål eller kommentarer til dette så skriv endeligt en kommentar.

Spørgsmål vil jeg så forsøge at svare på, og lægge ind her på siden, så snart der er fundet et svar på spørgsmålet

OZ8NZ, Ole

___________________ Program start _________________________

/*
Beskrivelse af stuktur i et Arduino program - OZ8NZ den 17 feb. 2014
Dette program viser de forskellige elemeneter som anvendes i et
program, og som er en god måde at strukture på, for at skabe oversigt
over de forskellige blokke i program
De små stumper kode som er indsat i void setup() og void loop(), vil få dioden på
port 13 til at blinke med 1 sec interval
*/

/*
I dette afsnit indsættes definitioner til biblioteker som skal anvendes
i programmet, et eksempel som er sakset fra RCT1307 programmet
*/
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68 // This is the I2C address
#define I2C_WRITE Wire.write
#define I2C_READ Wire.read

/*
Næste afsnit er definition af globale variable - en global variabel er data
som kan læses og skrives fra alle dele af programmet
disse er sakset fra RTC1307 programmet
*/
// Global Variables
int command = 0; // This is the command char, in ascii form, sent from the serial port
int i;
long previousMillis = 0; // will store last time Temp was updated
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
byte test;
byte zero;
char *Day[] = {"","Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
char *Mon[] = {"","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};

int led = 13; // definerer led på port 13

/* I dette afsnit indsættes funktioner som kan bruges fra alle moduler i programmet
Disse funktioner er sakset fra RTC1307 programmet */
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}

/* I dette afsnit indsættes procedurer ( delprogrmmer som kaldes fra programmet
eks på dette er fra sakset fra RTC1307 programmet */

void setDateDs1307() {
/* her indsættes de funktioner som programmet skal udføre,
bmærk at der startes med { og sluttes med } */
}

void blink(){ // blink på port 13 med 1 sec interval
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(500); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(500); // wait for a second
}

/* I dette afsnit indsættes setup som er et program der køres en gang ved start eller
reset, dette bruges til at initialisere f.eks baudrate til comport ,
void setup skal altid være i et program*/
void setup(){
// programkode indsættes her
pinMode(led, OUTPUT); // sætter port 13 til output
}

/* I dette afsnit indsættes void loop, void loop er den del af programmet
som udføres indtil reset eller power off af Arduino*/
void loop(){
blink(); // kalder blink programmmet til port 13
}



RTC moduletArduino UNO

Posted by OZ8NZ Ole Sun, February 16, 2014 17:01:08

Ja så fik jeg også lige testet at RTC modulet virker.

Jeg har fundet info om dette modul her : http://combustory.com/wiki/index.php/RTC1307_-_Real_Time_Clock#Reading_Data

og det software jeg har brugt er det som er på denne side.

Der findes også diagrammet til at wire RTC op mod Arduino smiley , så god fornøjelse med at afprøve dette modul.

Blog image
Bemærk at terminalprogrammet default er sat til 9600 baud, og da der her bruges 57600 baud, skal det lige sættes op, for at få det til at læse og skrive noget fornuftigt her smiley

Når klokken skal sættes er det et lidt underligt format; men det virker

formatet er Tssmmhhdayddmmyy, som er følgende

T er for transmit
ss er sekunder
mm er minutter
hh er timer
day er ugedagen starter med 1 som søndag
dd er dato
mm er måned
yy er år

et eksempel:T0059161160214 , dette giver 16:59:00 Sun 16 feb. 2014

R læser fra RTC modulet
Q er memory funktioner
Q1 initialiserer memory - sætter alt til 0
Q2 er dump af memory
Her er hvad jeg kunne læse i RTC molulet, hvad det lige er som findes i de enkelte registrere har jeg pt. ikke sat mig ind i; men jeg tror nogle er til at bruge frit ??

: RTC 1307 Dump Begin
0: 18 : 12
1: 84 : 54
2: 23 : 17
3: 1 : 1
4: 22 : 16
5: 2 : 2
6: 20 : 14
7: 3 : 3
8: 255 : FF
9: 255 : FF
10: 255 : FF
11: 255 : FF
12: 255 : FF
13: 255 : FF
14: 255 : FF
15: 255 : FF
16: 255 : FF
17: 255 : FF
18: 255 : FF
19: 255 : FF
20: 255 : FF
21: 255 : FF
22: 255 : FF
23: 255 : FF
24: 255 : FF
25: 255 : FF
26: 255 : FF
27: 255 : FF
28: 255 : FF
29: 255 : FF
30: 255 : FF
31: 255 : FF
32: 130 : 82
33: 255 : FF
34: 255 : FF
35: 255 : FF
36: 255 : FF
37: 255 : FF
38: 255 : FF
39: 255 : FF
40: 255 : FF
41: 255 : FF
42: 255 : FF
43: 255 : FF
44: 255 : FF
45: 255 : FF
46: 255 : FF
47: 255 : FF
48: 255 : FF
49: 255 : FF
50: 255 : FF
51: 255 : FF
52: 255 : FF
53: 255 : FF
54: 255 : FF
55: 255 : FF
56: 255 : FF
57: 255 : FF
58: 255 : FF
59: 255 : FF
60: 255 : FF
61: 255 : FF
62: 255 : FF
63: 255 : FF
RTC1307 Dump end



Jeg har lagt koden her, så er der i hvert fald hvad der skal bruges, den er meget simpel og kan kun læse fra og skrive til RTC samt et par initialiseringer, som der måske kan være behov for.

OZ8NZ, Ole







Mit DemoboardArduino UNO

Posted by OZ8NZ Ole Sun, February 16, 2014 14:18:58

Ja så har jeg fået lavet mig en lille kasse, hvor delene er til at lege med til vores Arduino projekt.

Jeg har også lige leget lidt med at få den til at tælle blink og give et output til et relæ, hver gang vi er nået til 100.

Koden er her hvis nogen har lyst til at bruge det til noget

Og her er et billede af min lille kasse

Blog image



Lille blinkprogram til dioden på port 13Arduino UNO

Posted by OZ8NZ Ole Sat, February 15, 2014 12:27:33

Her er et lille eksempel til blink på port 13, hvor det er muligt at indsætte blink intervallet fra terminalen

Det skal bemærkes at hver gang terminalen åbnes er det som at trykke på reset, da programmet startes op på ny hver gang, men det virker godt til debug og hvad der ellers kan leges med fra terminalen

Og her er kildekoden til at kopiere så det kan køres :



Demo Board er startetArduino UNO

Posted by OZ8NZ Ole Thu, February 13, 2014 17:27:30

Dette er mit første lille forsøg på at se om det virker efter alt er installeret og sat op, og det ser ud til at alt er som det skal være.
Jeg har fundet en ting som undrer lidt og det er at der oprettes en USB til comport hver gang et nyt board anvendes. Det fandt jeg ud af da jeg nu har været i gang med at teste 2 stk. Auduino UNO boards og et Mega board. Det har så givet mig 3 forskellige porte at arbejde på, måske fornuftigt hvis der skal udvikles på flere boards ? men virker lidt underligt hvis det kun er fordi der sættes et andet board til PC'en.

Blog imageBoardet er sat til at læse fra en fugt og temperatur sensor, og dette er lagt her kun for at finde ud af om de forskellige funktioner i bloggen er brugbare.
Ole, OZ8NZ