ingen slogan
Inlägg taggade pic
Vattna blommorna – del 10
21 Aug 09
Nu händer det grejer.
Mitt program för min pic känns komplett. Har suttit och debuggat kod nu ikväll och kommit fram till att den lösningen jag postade nu senast inte var den bästa, för att vara helt ärlig.
Bland annat så verkar inte !RA# fungera riktigt i kompilatorn av någon anledning. Koden beter sig konstigt när detta händer. Eller har jag bara programmerat kasst?
Efter lite kodändringar fungerade det!
Koden ser ut såhär nu:
#include <pic16f690.h>
typedef unsigned int word;
word at 0x2007 __CONFIG = (_INTRC_OSC_NOCLKOUT & _CP_OFF & _WDT_OFF & _BOR_OFF & _PWRTE_ON & _MCLRE_OFF & _IESO_OFF & _FCMEN_OFF);
void delay_ms(long ms)
{
long i;
while (ms--)
for (i=0; i<=50; i++) //50 iterations is _basically_ 1 ms.
;
}
unsigned int pumpint=0; //just an int for loops..
unsigned int totalpumpms = 0; //A counter for how many ms the pump has been running
unsigned static int maxpumpms = 100000; //Change this if you are using a slower/faster pump.
void main () {
TRISC = 0x00; /* PORTC, All outputs */
TRISA = 0x1f; /* RA1-RA4 input, RA>4 output */
while(1)
{
pumpint = 0;
//Start pumping water, if RA3 isn't activated.
if(RA3 || totalpumpms >= maxpumpms)
{
//Do nothing..
delay_ms(1);
}
else
{
while(pumpint < 5000) //Max pumptime is 5 secs.
{
if(RA3) //If(ra3) is used since while(ra3) doesn't seem to work as good with sdcc compiler.
{
break;
}
else if (totalpumpms >= maxpumpms)
{
break;
}
PORTC=0x0f;
//As an extra marker, never pump for more than 5 secs.
delay_ms(1);
totalpumpms++; //Add to the total pumpmscounter.
pumpint++; //just for this loop.
}
pumpint = 0;
}
//Pumping done. Wait 15 minutes
PORTC=0x00; //Close all outputs
//Reset button must work within this time. Don't sleep for a whole 15 mins, but keep polling.
while(pumpint <= 90000) //15 min == 900000ms. We're polling each 100ms.
{
if(RA4) //RA4 is the reset switch
{
totalpumpms = 0;
break;
//at this point, we have resetted the counter, and let the water start pumping again.
}
pumpint++;
delay_ms(100);
}
}
}
För närvarande använder jag Windows 7 (ja, jag vet, det är inte omtyckt, men faktum är att win börjar konkurrera med kde och linux..) och mitt debuggingprogram blev ”Real Pic Simulator” som utförde sitt arbete mycket väl! Programmet är dock inte gratis, men en 30-dagars testversion gick att ladda ner. Och mer tid behöver jag nog inte
.
Som open source entusiast skulle jag kört gpsim som är det naturliga och självklara valet om man tycker om öppen mjukvara men jag tyckte inte att jag hade lust med att mecka conf-filer och tillägg för att få just min pic att stödjas. RPS fick funka ikväll, vilket det gjorde!
Nu kan jag lugnt slappna av resten av kvällen och njuta av mitt arbete
.
Imorgon blir det att kolla nya möbler och liknande, då vår flytt har ändrats från 1:a November till 1:a Oktober/Mitten på September.
Ha en god afton. Själv Njuter jag med lite jamaicansk öl. Det är ju inne med Jamaica nu ![]()
/Marcus
Vattna blommorna – Del 7
10 Aug 09
God morgon!
Tänkte jag kunde bidra med koden som jag skrev igår. Den är nog inte helt färdig vid närmaste eftertanke, men jag tror den fungera som den skall just nu. Det enda som inte är testat är RA2 och hur den fungerar. Men det hoppas jag den gör
.
Blir det att köra till Kjell.com och köpa lödkort ikväll?
Koden jag skrev ser ut enligt följande:
#include <pic16f690.h>
typedef unsigned int word;
word at 0x2007 __CONFIG = (_INTRC_OSC_NOCLKOUT & _CP_OFF & _WDT_OFF & _BOR_OFF & _PWRTE_ON & _MCLRE_OFF & _IESO_OFF & _FCMEN_OFF);
void delay_ms(long ms)
{
long i;
while (ms--)
for (i=0; i<=50; i++) //50 iterations is _basically_ 1 ms.
;
}
unsigned int pumpint=0; //just an int for loops..
unsigned int totalpumps = 10; //Keeping total pumps for ten pumps before a reset is needed (until calculated how much 10 litres goes for)
void main () {
TRISC = 0x00; /* PORTC, All outputs */
TRISA2 = 0x01; /* RA2 input */
while(1)
{
//Start pumping water, if RA3 isn't activated.
//Wait for the breaking SW1
if(!RA3 && totalpumps < 10)
{
while(1)
{
if(RA3)
{
break;
}
PORTC=0x0f;
//As an extra marker, never pump for more than 5 secs.
delay_ms(1);
if(pumpint >= 5000) //Loop until 5000ms == 5secs is reached.
{
PORTC=0x00;
pumpint = 0;
totalpump++;
break;
}
pumpint++;
}
}
//Pumping done. Wait 15 minutes
PORTC=0x03;
//Reset button must work within this time. Don't sleep for a whole 15 mins, but keep polling.
while(pumpint <= 90000) //15 min == 900000ms. We're polling each 10ms.
{
if(RA2) //RA2 is the reset switch
{
totalpumps = 0;
pumpint = 0;
}
pumpint++;
delay_ms(10)
}
}
}
Som ni säkert ser så är det inget direkt avancerat för att skriva program till en PIC:-).
Ska ta och skapa mig en riktig projektsida här på bloggen om just detta. Så fort jag har lite mer fysiskt arbete klart!
Vi hörs
Marcus
Vattna blommorna – Del 6
9 Aug 09
Idag har jag fått lite tid till att programmera lite mer på mitt blomstervattnarprojekt!
Den stora anledningen till varför det har tagit så lång tid har varit för att jag har tyckt att det har varit roligare med att programmera annat,men framförallt att Windows har krävts för att labbkortets switchknapp skall fungera. Och jag är ju ingen jättefan av Windows, när det gäller hemanvändning
.
Oavsett operativsystem så fick jag igång alltihop och nu ser det ut att fungera precis som det skall.
Programflödet i piccen ser ut enligt följande:
- Vänta 60 sec innan rutinen körs igångs.
- Kolla att RA3 är FALSE
- Om FALSE Pumpa vatten 5 sec eller till RA3 blir TRUE
- Vänta 15 min. Kör om rutinen.
Det är ett relativt enkelt program (till att börja med iallafall) som inte gör mer än vattnar på enklaste vis.
Kod kan jag posta först imorgon, då datorn är avstängd och jag för närvarande skriver från min netbook.
Jag återkommer med mer information imorgon!
På återseende!
Marcus
En.. Lördag?
8 Aug 09
Jaha.. Vad ska man göra idag?
Personligen skulle jag vilja lägga ner lite tid på mitt blomsterprojekt. Men jag vet inte om det verkligen blir så. Det är första fina helgen i Helsingborg på iallafall fyra veckor, och min käraste vill helst till stranden. Är det acceptabelt att ta med sin dator till stranden? Tror inte det.
Det finns så mycket jag _vill_ göra men som det inte riktigt finns tid till. Vilket suger lite grann, om jag ska vara ärlig.
Bland annat så vill jag
- Få klart min blomstervattnare.
- Skriva en klient mot Spytify
- Skapa ett roligt php-projekt
- Lära mig C bättre
- Lära mig C++ bättre
- Lära mig C# (Mono) bättre
Jag kanske har för höga ambitioner, men det är några av sakerna som jag har som mål att bli färdig med i höst.
Vad som är extra irriterande är att jag är så duktig på att tänka ut vad jag vill göra, men sämre på att utföra det. Någon annan som har det problemet?
Nu är det dock dags för att göra lite hushållssysslor. Ta tag i disken bland annat. Vi hörs!
/Marcus
Vattna blommorna – Del 5
18 Jul 09
Det blev inte så mycket programmerat igår, men lite grann fick jag till iaf.
Konsten att förstå sig på en PIC-processor kräver att man läser en massa dokument. Och Microtec har dokument för sina Pic:ar, men de vill givetvis inte skriva något annat än assembler.
Men SDCC verkar inte ha några exempel, än de man surfar efter. Mina skills är helt enkelt inte de bästa när det gäller PIC-programmering generellt. Har jag tagit mig vatten över huvudet, eller komme jag klara det efter lite tid? Vi får se, men jag ger mig inte så fort =).
Jag hittade ett projekt som hette i4uC, som är ett öppen källkodsbaserat IDE för Mikroprocessor som använder SDCC och där PIC16F690 stöds. Det gick inte så bra att installera i ubuntu, så jag får göra det i Arch lite senare, som ivf är en miljö med många nya paket och inte 3 år gamla. Det får bli en senare utmaning.
Det var ett litet sidorpår. Jag gjorde en del programmering igår, bland annat testade jag RC-utgångarna för att få leddarna att lysa. Man använder egentligen bara en variabel för att sätta igång de olika, där 0×00 är alla avstända och 0x0F är alla 4 tända. Kombinationerna ser ut såhär:
Hex Led1 Led2 Led3 Led4 0x00 0x01 x 0x02 x 0x03 x x 0x04 x 0x05 x x 0x06 x x 0x07 x x x 0x08 x 0x09 x x 0x0a x x 0x0b x x x 0x0c x x 0x0d x x x 0x0e x x x 0x0f x x x x
Jag gjorde tested enkelt genom att bara skriva lite kod som ändrar hexkoden och väntar 100ms:
#include
typedef unsigned int word;
word at 0x2007 __CONFIG = (_INTRC_OSC_NOCLKOUT & _CP_OFF & _WDT_OFF & _BOR_OFF & _PWRTE_ON & _MCLRE_OFF & _IESO_OFF & _FCMEN_OFF);
void delay_ms(long ms)
{
long i;
while (ms--)
for (i=0; i < 100; i++)
;
}
void main () {
TRISC = 0x00; /* PORTC, All outputs */
PORTC = 0x00;
while (1)
{
PORTC = 0x00;
delay_ms(100);
PORTC = 0x01;
delay_ms(100);
PORTC = 0x02;
delay_ms(100);
PORTC = 0x03;
delay_ms(100);
PORTC = 0x04;
delay_ms(100);
PORTC = 0x05;
delay_ms(100);
PORTC = 0x06;
delay_ms(100);
PORTC = 0x07;
delay_ms(100);
PORTC = 0x08;
delay_ms(100);
PORTC = 0x09;
delay_ms(100);
PORTC = 0x0a;
delay_ms(100);
PORTC = 0x0b;
delay_ms(100);
PORTC = 0x0c;
delay_ms(100);
PORTC = 0x0d;
delay_ms(100);
PORTC = 0x0e;
delay_ms(100);
PORTC = 0x0f;
delay_ms(100);
}
}
Efter det är det bara att kompilera med SDCC och skicka ut genom PicKit2:
$ sdcc -mpic14 -p16f690 -V main.c && pk2cmd -B/usr/share/pk2/ /PPIC16F690 -Fmain.hex -M -T
Nu ska jag iväg till mina föräldrar. so long.
Vattna blommorna – Del 4
17 Jul 09
Det blev aldrig något blogginlägg igår, sorry! Har satt som mål att skriva något ivf varje dag, så jag inte tappar fokus. Men, även om jag glömde skriva igår har jag inte tappat fokus =).
Vid lunchtid igår åkte jag ner till NovaLund och köpte mig ett PicKit2, Supermikrobrytare, Relä, Kabel och annat sådant trevligt som varje tekniknördig man kräver för tillfredsställning!
Berättade lite om mitt projekt för clerken (Svenskt ord här tack) som tyckte det lät roligt, och även han hade haft planer på att göra ett, men som aldrig blivit av
(tänka sig, det finns fler som snackar utan verkstad).
Nåväl, efter jobb blev det hem och prova det nya kittet, och till min besvikelse så vill MikroChip enbart skriva sin kod i assembler. Assembler är sååå 1980…
. Jahapp, ut och kolla på nätet vad det fanns för några bra grejer som kunde kompilera C-kod och som kunde köras i min PIC16F690 (som medföljde). Och efter lite sökande på nätet hittade jag att 16f690 inte var särskilt väl anpassad för att skriva C-kod. GAH!
Det fick bli iväg till kjellan igen och köpa mig en annan PIC. Denna gången var det inte en kunnig/intresserad clerk dock, utan det fick bli standard-väla-personalen där kunskapen sträcker sig till DLINK == ROUTER. Nåväl, jag var rätt säker på vad jag skulle ha, men behövde veta ifall den passa, vilket han inte visste (Nu ska jag nog inte vara så hård mot honom egentligen, han sa att det var hans första dag! Han löste det galant med att hämta delen och lova att det gick att returnera ifall den inte passade). Jag hade två alternativ på PIC:ar, PIC18F2550 & PIC18F4550. 4550 såg ut att vara alldeles för stor, så det fick bli 2550 som jag läst skulle vara bra för C-kod. Jag betalar 79:-, kör hem glatt tillsammans med Angie (som snällt följde med som sällskap
, kommer hem och ser att den har 4 pinnar för mycket…. Jag höll på att bli tosig! Det var väll fanken vad svårt det skulle vara att få tag i något som fungerar!
Mer forum. Kan man öht skriva sitt program i C eller måste man skriva det i assembler. Läser något om SDCC, klickar och blir överlycklig. Ett öppenkällkodsprojekt för Mikroprocessorer! Jippi! Dom har lagt in stöd för de flesta, och Microchips PIC:ar är påväg in!
Installerar, börjar koda men inser att det inte var så väl dokumenterat när det gällde på hur man skulle göra. Nåja! Det ordnar sig säkert. Det gäller bara att hitta rätt i pic16f690.h filen.
Just nu ser min kod ser ut enligt följande:
#include <pic16f690.h>
void main(void){
//Jaaadåå vi har ett c-program som görs om till assembler och därefter till binärkod!
//Work in progress haha}
Så, ikväll, tillsammans med lite rötjut kan det bli mycket kodat!
Hoppas Andjelka inte tycker jag är en pina för jag nördar mig…
Mer rapport ikväll!
Marcus
Vattna blommorna – Del 3
15 Jul 09
Hade ett långt samtal med min käre far idag, som ansåg att inblandningen med fuktsensor/mäta ph-värdet/resistansen i jorden är inte någon särskilt bra teknik, eftersom att stavarna kommer oxidera inom en vecka, och därmed kräva att man polerar dem lite då och då, vilket inte känns roligt på ett ”automatiserat system”.
Det stora problemet med oxidering är att när det oxiderat tillräckligt länge kommer man inte få någon kontakt alls när man ska mäta, vilket innebär at maskinen kommer tro att där är torrt oavsett hur mycket vatten man pumpat in, vilket kan resultera i mycket vatten på golvet
.
Ska man utesluta det får man ha en mikrobrytare i botten som är riktad neråt med en bit frigolit som lyfts upp med vattennivån, som en extra säkring på att man inte ”häller över kanten”. Och har man ändå satt en sådan kan man lika gärna utesluta jordfuktigheten och bara använda den väldigt nära botten på krukan för att inte få överskottsvatten, som gör att blomman surnar.
En annan sak vi kom fram till var att vattnet lätt surnar ifall man låter det stå still, så eventuell fläkt/motor kan (ej bekräftat om det går) behövas i tanken för att ”röra om” vattnet. Ska man se till att vattnet inte surnar måste man destillera det för att ta bort alla tillsatser/alger, vilket låter dyrt och tidskrävande. Alternativt att man häller i något medel som gör att det inte surnar, men det lär inte blommorna tåla. Tål inte blommor surt vatten?
Med andra ord blir det lite ändringar i planen. PIC-processorn behövs fortfarande, förstås för att mäta hur mycket vatten som pumpats upp för att se till att inte pumpen torrkörs (då går den sönder).
En annan ändring är att jag nog ska köpa en PIC18XXXX istället, då de kör på C-kod och inte Asembler.
Snabb ritning
Vattna blommorna – Del 2
14 Jul 09
Hade lite mer funderingar idag under lunchen på jobb. Funderingar som rörde ifall jag borde ha någon typ av sensor som känner av hur fuktig jorden är. Och automatisera det ännu mer än vad en timerbaserad är. Förvisso är det enklare att göra en tidsbaserad som vattnar ett par gånger om dagen. Men det känns inte lika kul, eller hur?
Alternativen är att sänka en fuktsensor i en håla i jorden för att mäta luftfuktigheten. Eller att använda sig av två metallstänger som försöker ”nå” varandra genom jorden, och därefter använda motståndet i jorden som mätbarhet (högre motstånd, mindre vatten).
Jag har ingen aning om alternativ nummer ett fungerar över huvudtaget så jag antar att det får blir alternativ nummer två.
Så. Kollar vi kostnader:
- Pump, 79,90
- Pic processor PIC16F886 49:-
- Experimentkort 45:-
- Kabel för kontakt.. Vet inte vad de heter UNKNOWN:- TIPSA GÄRNA
- Plastdunk med lock, 10 liter, 45:-
- Vävslang, 9mm 15:-/st
- Tryckströmbrytare. 2X a 19:-
- Röd diod för påfyllning av vatten 39:- för fem
Det borde räcka för tillfället. Projektet landar (just nu) på 308:-
Det blir att köpa dessa delar nästa lön (just nu är det lite tajt) :>. Ska bli ett roligt projekt.
Hur hade du löst problemet? Vad hade du köpt?
Trevlig kväll
/marcus
Vattna blommorna – Automatiskt
14 Jul 09
Fick precis en snilleblixt. Det är så fruktansvärt tråkigt att vattna blommorna i lägenheten. Så pass tråkigt att både och Andjelka glömmer/struntar i det. Och om vi nu eventuellt ska flytta till en större lägenhet, lite närmare folket (Just nu bor vi på 4:e våningen och lägenheten vi eventuellt ska ta över ligger på 2:a) kanske det kan vara dags att ta hand om blommorna lite mer
. Dock vet jag inte hur länge vi kommer vattna blommorna (haha) innan vi skippar det igen.
Så. Idén kom att snickra ihop en liten automatisk dosa som själv vattnar blommorna med en pump och lite vatten
Hur löser vi det här? Låt oss säga att vi inte bryr oss om att känna på jorden innan vi vattnar, utan vi ska bara vattna 1 dl var 3e timme (till en början får vi nöja oss med att ha växter som kräver den mängden med vatten) tills vattnet är beräknat slut i tanken.
Vi kommer behöva:
- 10-liters spann med vatten
- En pump som kan pumpa lagom med vatten (12V pump med en kraft på 7.5l/min hittad på biltema)
- Slangar som kan transportera vattnet från spannen till krukorna
- Kopplingskort för PIC
- PIC-processor
- Strömkabel att koppla med på kortet
- Elektroniklåda som håller kortet
- Displayer som visar hur många gånger det pumpats
- Röd diod som lyser ifall vattnet börjar ta slut (matematiskt uträknat med sekunders körning kontra flödet vatten som passerar) och avbryter processen för pumpning.
- Strömbrytare till pumpen, styrd från pic-processorn
- Reset-omkopplare som nollställer räknaren efter att man fyllt på vatten i spannen
- PIC-programmerare (har ingen just nu)
Har jag glömt något? Tipsa gärna isf!
Det mesta finns nog att köpa på kjell.com. Jag får titta på det imorgon!
Trevlig kväll!
Mvh
Marcus



