Buggfix Plus
Aktuellt datum och tid: 17.05 2018-09-23

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 66 inlägg ]  Gå till sida 1, 2, 3, 4, 5  Nästa
Författare Meddelande
 Inläggsrubrik: Arduino robotprogrammering
InläggPostat: 22.23 2018-05-04 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.53 2010-01-04
Inlägg: 4696
Ort: Skogen mellan Uppsala-Gävle
Hej!

Sitter med mitt och lillans projekt och vill göra så mycket kod klar som möjligt innan hårdvaran är klar.
Det som jag ser som den största utmaningen blir att få till den här delen av styrningen.

Vi har 4 st knappar, , , och X som inputs, samt en svartvit 128x64 0,96" I2C OLED som output.
Jag har inte testat klart än, men typsnittet kommer bli att varje symbol kommer vara ~20x20 pixlar. Tre rader blir det i alla fall.

Det vi vill göra är att om man tex trycker upp, upp, ner, ner, vä, hö, vä, hö så visas just detta i displayen. Trycker jag sedan en gång på X så raderas senast inmatade symbolen och man kan sedan fortsätta att trycka sekvensen.
Håller jag inne X länge så raderas hela sekvensen.
Det jag verkligen inte vet hur jag ska hantera är hur, och i vilket "format", jag sparar varje knapptryckning. Och hur gör jag rent programmeringstekniskt för att "radera senaste symbolen"?
Är väldigt tacksam för all slags input och orkar någon skriva ihop någon slags psuedo-kod för just det här så vore det kanon. Alltså inte vad som gäller grafiken, utan just hur man bör spara/radera.


Bilaga:
20180504_230516.jpg


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 00.49 2018-05-05 
Användarvisningsbild

Blev medlem: 22.33 2005-12-09
Inlägg: 3091
Ort: Helsingborg
Strukturera det som en tillståndsmaskin så blir det enkelt, något i stil med:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
while(true){
   waitseconds(0.1);

 switch(State){
 
  case WAIT_FOR_KEYPRESS:
   TimeCounter=0;
   switch(key){
    case X:
     State=X_PRESSED;
     break;

     case UP:
     State=UP_PRESSED;
     break;
   
    }
    break;

   case X_PRESSED:
    if(TimeCounter==0){
     EraseLast();
    }
    elseif(TimeCounter>10){
     EraseAll();
    }
    TimeCounter++;
    if(key==0){
     State=WAIT_FOR_KEYPRESS;
    }
   break;

   case UP_PRESSED:
     do_up();
     State=WAIT_FOR_KEY_REALEASE;
     break;

    case WAIT_FOR_KEY_REALEASE:
     if(key==0){
      State=WAIT_FOR_KEYPRESS;
     }
     break;


}

       





Upp
 Profil  
 
InläggPostat: 06.52 2018-05-05 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23081
Ort: Kristinehamn
Jag anser att den sekvens av rörelse som ska exekveras i grunden är en byte som anger riktning.

Om du börjar med en byte som stegräknare och sedan kan spara den i adress 0 på EEPROM kan alla efterföljande steg sparas i EEPROM på adress 1 och vidare fram.

Det är sedan stegräknaren som styr antal steg och inmatningen.


Upp
 Profil  
 
InläggPostat: 08.05 2018-05-05 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.53 2010-01-04
Inlägg: 4696
Ort: Skogen mellan Uppsala-Gävle
Det där ska jag nog kunna jobba ifrån Krille Krokodil, tack :tumupp:

Ok Icecap. Så alltså nyttja en byte som enbart räknar antal steg och sedan låta varje riktning sparas som en byte också.
Det känns som en bra väg att gå. Behöver göra en omvandlingstabell från dessa byte till grafiken också.

Finns det någon anledning till varför man borde spara i EEPROM? Kommer det ta på tok för mycket RAM om jag sparar det där istället? Det gör inget om sekvensen försvinner vid reset.


Upp
 Profil  
 
InläggPostat: 08.13 2018-05-05 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23081
Ort: Kristinehamn
Självklart kan du använda RAM, det är ju bara att reservera en storlek om det antal steg som maximalt ska kunde läggas in.


Upp
 Profil  
 
InläggPostat: 19.40 2018-05-06 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.53 2010-01-04
Inlägg: 4696
Ort: Skogen mellan Uppsala-Gävle
Perfekt. Det ska nog bli bra det här...

En relaterad fråga till er kunniga där ute:

Jag tog ner ett färdigt bibliotek till displayen (Biblioteket), och tänkte nyttja "grovarbetet". Dock med baktanken att lägga till ett eget typsnitt som enbart innehåller är våra symboler.
För att se lite vad för data som skickas över så kollade jag i SSD1306Ascii/src/fonts/TimesNewRoman13.h och ASCII 124, vilket borde vara ett "|". I filen består symbol 124 av två byte så här 0xFE, 0x78, // 124.

Min fråga är då, hur i hela friden blir 0xFE78 (1111111001111000) ett | ? Detta ska alltså ge tillräckligt med data för 10x13 pixlar??


Upp
 Profil  
 
InläggPostat: 19.53 2018-05-06 
Användarvisningsbild

Blev medlem: 09.27 2011-08-14
Inlägg: 1117
Men tecknet är bara 1x13 stort. Titta på "width" som är 0x01 högre upp.
Det verkar som det är en tom pixel högst och lägst, | är alltså bara 11 pixlar högt.
Sen blir det tre bittt över.
Det kanske står nånstans hur det görs, eller titta på nåt annat tecken, för att se
exakt hur bitarna placeras i höjdled. Det kanske snarare är såhär
.xxxx---xxxxxxx.
där . är tom pixel, x är full pixel och --- är de tre som blev över 13.


Upp
 Profil  
 
InläggPostat: 20.02 2018-05-06 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.53 2010-01-04
Inlägg: 4696
Ort: Skogen mellan Uppsala-Gävle
Ahaaa, Helt rätt! Fasen vad snyggt hawkan! :tumupp:
Hade helt missat "char width"-delen :doh: .
Ska gräva lite mer, men nu är vi på gång igen. Tack för att du tog dig tid och grottade bibliotek!


Upp
 Profil  
 
InläggPostat: 22.58 2018-05-06 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.53 2010-01-04
Inlägg: 4696
Ort: Skogen mellan Uppsala-Gävle
Eller ja, trodde det var enklare än vad det verkar vara. Testade med "+", men blir inte klok på hur symbolen laddas in. 7x13 pixlar. 20, 20, 20, FC, 20, 20, 20, 00, 00, 00, 08, 00, 00, 00.

Ritar jag upp det på papper så känns det som att man avrundar bredden till jämnt antal nedåt. Ritar upp rad för rad, upp till ner, och sen lägger till den vertikala avrundade delen.
Nej, ingen ro i skallen för sånt här nu.


Upp
 Profil  
 
InläggPostat: 03.21 2018-05-07 
Användarvisningsbild

Blev medlem: 09.27 2011-08-14
Inlägg: 1117
Om jag bara tittar som hastigast så är det två grupper med 7 bytes. Den första gruppen är antingen övre eller undre delen av tecknet. Min gissning är att de sju första byten är undre delen av tecknet, med "1" längst ner. Den nästa sju byten använder bittar 4-8. Så om man ska forma en sextonbitars int för första kolumnen borde det bli byte1 + ((byte8 &0xf8) << 5). Ta det vertikala delen av '+' blir då byte4=0xfc och byte11=0x08. 0xfc + ((0x08 & 0xf8) << 5) = 0x1fc. I bittar blir det 0000111111100 tror jag som ju är den raka kolumnen i '+'. Det är "bara" att göra baklängers om du ska göra dina egna tecknen.


Upp
 Profil  
 
InläggPostat: 12.47 2018-05-07 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.53 2010-01-04
Inlägg: 4696
Ort: Skogen mellan Uppsala-Gävle
Hmm. Hänger inte med.
Varför AND:ar du med F8 och sen skiftar 5grr till vänster?


Upp
 Profil  
 
InläggPostat: 13.52 2018-05-07 
Användarvisningsbild

Blev medlem: 09.27 2011-08-14
Inlägg: 1117
För att bara fånga de högsta bittarna i övre byten.
Tecknet är är 13 bittar högt, 8 i undre byten och fem i övre byten. De i övre byten verkar ligga som bit 4-8.
Det är tre bittar 1-3 som du får kasta bort. Det finns olika sätt att göra det.
Uppskiftning med 5 för att 13-8=5

0x08 = 00001000
0x08 & 0xf8 = 00001000 & 11111000 = 00001000 (igen. Detta steget kan möjligen vara onödigt)
0x08 << 5 = 00000001 00000000
Plus undre byten
00000001 00000000 + 11111100 = |

Man kan ju tänka sej att nerskifta med 3 istället.
0x08 >> 3 = 00000001 och särbehandla denna som den övre byten.

Eller när man börjar jobba med bittarna i den övre byten så börjar man från de högsta bittarna,
och loopar från bit 8 till och med 4 i övre byten.


Upp
 Profil  
 
InläggPostat: 08.23 2018-05-08 
EF Sponsor
Användarvisningsbild

Blev medlem: 17.53 2010-01-04
Inlägg: 4696
Ort: Skogen mellan Uppsala-Gävle
Ah. Tror jag hänger med på vad du skriver men förstår fortfarande inte hur displayen laddas med bitarna. Och vad den gör för skillnader när man ändrar bredd och annat.

Testade att göra en egen font och inkludera denna i allfont.h, men får bara en massa felmeddelanden. Nej tvi vale för det här. Att det ska vara så svårt... :(


Upp
 Profil  
 
InläggPostat: 08.35 2018-05-08 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 23081
Ort: Kristinehamn
Nu är det på ett ganska annat sätt som jag skriver tecken till de klockor jag lekar med men jag skapar ett bitmönster för varje tecken.
.....
X...X
X...X
.X.X.
..X...
.X.X.
X...X
X...X

Detta ger 0x63, 0x14, 0x08, 0x14, 0x63.

Och det är likadan det fungerar i den teckentabell, bara med 16 bit och Big Endian.


Upp
 Profil  
 
InläggPostat: 10.32 2018-05-08 
Användarvisningsbild

Blev medlem: 09.27 2011-08-14
Inlägg: 1117
Jo så verkar det vara här också. Fast för den övre delen av tecken, 13 högt,
används fem bittar (8+5) och det var väl isoleringen av dessa 5 bittar som var oklart.

Ett tips är att börja med en befintlig typsnitt/tabell och ändra en sak i taget.
Börja t ex med att byta ut bitmappen för ett tecken mot ett annat lika stort.
Och sen ändra t ex bredden. osv. Så borde det väl gå.


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 66 inlägg ]  Gå till sida 1, 2, 3, 4, 5  Nästa

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 2 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010