Научи ме

Програмиране => C/C++ => Темата е започната от: jazzman в 30 Октомври 2016, 03:42:51

Титла: странен тайминг
Публикувано от: jazzman в 30 Октомври 2016, 03:42:51
 Таз  (http://www.atmel.com/tools/AVRISPMKII.aspx) джаджа пристигна онзи ден. Вързах я към един atmega328, ъплоаднах към кода него и системата заработи обаче ..... delay-я нещо се ебава :) Примерно за да задам delay от 1 сек, трябва да напиша 50 вместо 1000.

Код: C
  1.  
  2. #include <avr/io.h>о
  3. #include <util/delay.h>
  4.  
  5. #define BLINK_DELAY_MS 50
  6.  
  7.  

Ако ъплоадна кода директно към Ардуино борда ( моят има ISP конектор ) всичко е нормално както преди :)

Титла: Re: странен тайминг
Публикувано от: kjufte в 30 Октомври 2016, 11:04:28
Ами функцията delay се осланя на системният такт.
Ти като компилираш сетваш един глобален define, с който казваш, че clock-a с който захранваш системата е 16MHz (ако не си го сетнал default-a е 1MHz).
Това обаче е нещо, което ти просто обещаваш на компилатора и той ти вярва. А истинската стойност, която е нагласена хардуерно в микроконтролера се настройва с fuses.
Ако погледнеш в секцията Fuse Bits на ATmega328/P datasheet (http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_datasheet.pdf) ще видиш
1) CKSEL бит-овете са настроени по default за 8MHz
2) CKDIV8 ти е сетнат пак по default. Това значи, че клок-а ти се дели на 8, което ти дава ефективен такт от 1MHz

Другото голямо проблем, е че тези функции са мислени само за кратки чакалъци (примерно switch debouncing)
В документацията на хедъра delay.h (http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html) четем, че максималната стойност на чакалнята е
Цитат
The maximal possible delay is 262.14 ms / F_CPU in MHz.
Което значи при такт от:
1MHz   -> 262.14 ms
8MHz   -> 32.8 ms
16MHz -> 16.4 ms

При по-големи зададени стойности от максималните, функциите започват да разтягат локуми и не са точни.


Ето ти един fuse-калкулатор (http://www.engbedded.com/fusecalc) скойто можеш да си пресметнеш стойностите за 3-те байта.
Много внимавай кои bits ще сетнеш, защото може да си направиш микроконтролера неизползваем.
Бих те посъветвал RSTDISBL, SPIEN и DWEN да не ги бараш. Т.е. не да не ги сетваш, а да ги остваиш така както са си!

Командата за четене на актуалните стойности с avrdude ще ти изглежда нещо такова
Код: Text
  1. avrdude -c avrisp2 -P /dev/ttyUSB0 -p m328p -n -v

Порта естествено трябва да си го нагласиш. Също така и не разбрах atmega328 или atmega328p имаш. Съответно махаш от командата 'p'-то ако трябва.


Титла: Re: странен тайминг
Публикувано от: jazzman в 30 Октомври 2016, 13:03:47
Промених честотата от 16 на 1 MHZ и ми се струва нормално вече.

Цитат
avr-gcc -Os -DF_CPU=1000000UL -mmcu=atmega328 -c -o blink.o blink.c


Цитат
Бих те посъветвал RSTDISBL, SPIEN и DWEN да не ги бараш. Т.е. не да не ги сетваш, а да ги остваиш така както са си!

Знам това.

Цитат
Също така и не разбрах atmega328 или atmega328p имаш. Съответно махаш от командата 'p'-то ако трябва


Имам и от двете.


 
Титла: Re: странен тайминг
Публикувано от: jazzman в 01 Ноември 2016, 14:02:11
Цитат
Порта естествено трябва да си го нагласиш.


Що не мога да намеря пущината ;)

Ето командата с коята ъплоадвам дейтата към чипа: 

Код: C
  1. avrdude -c avrisp2 -P usb -p atmega328p -U flash:w:blink.hex
  2.  


Обаче ако искам да видя изход примерно с "cat /dev/usb // пробвах всичко възможно от /dev директорията ", с ардуино беше лесно - "cat  /dev/ttyACM0" 
Титла: Re: странен тайминг
Публикувано от: kjufte в 01 Ноември 2016, 15:02:01
Щото ти трябва примерно един USB TTL converter (https://www.amazon.ca/niceeshop-Module-Serial-Converter-CP2102/dp/B00F167RMM/ref=sr_1_4?ie=UTF8&qid=1478004965&sr=8-4&keywords=usb+ttl), който да ти даде някъв порт. Или ако компа ти е от по-старите и има RS232 вход може направо с него да се свържеш директно като си моднеш някое старо кабелче.
Титла: Re: странен тайминг
Публикувано от: jazzman в 01 Ноември 2016, 17:35:13
Ако взема таз джаджа то тогава не се ли обезмисля ползването на  AVRISP-то? 
Титла: Re: странен тайминг
Публикувано от: kjufte в 01 Ноември 2016, 18:43:17
Едното няма нищо общо с другото. Програматора използва SPI (https://en.wikipedia.org/wiki/Serial_Peripheral_Interface), а ти искаш да осъществиш комуникация през UART (https://en.wikipedia.org/wiki/Universal_asynchronous_receiver/transmitter).
С тоз USB to TTL обръщач не можеш да програмираш микроконтролера.

Ардуинотата също имат такъв преобразуващ чип (FTDI най-често) и за това виждаш порт за комуникация.
Титла: Re: странен тайминг
Публикувано от: jazzman в 01 Ноември 2016, 19:48:54
Ясно.... :) Добре, но ако искам да направя някакъв дебъгинг по кода, да речем искам да разбера каква стойност връща photo cell sensor-a, прилично IDE ли ще ми трябва? 
Титла: Re: странен тайминг
Публикувано от: kjufte в 01 Ноември 2016, 20:10:14
Приличното IDE ще ти трябва така или иначе. За дебъгинг ти бях писал в постинга, където ти писах и за AVRISP mkII.
Има (минимум) два варианта за дебъгване.
1. добрият стар printf, което значи че ще ти трябва връзка през UART
2. дебъгинг хардуер, с който слагаш break points и да четеш директно регистри и памет (променливи) на микроконтролера
3. аз ползвам винаги комбинация от 1 и 2, но не на avr-ки, а на STM. Атмелските чипове съм ги дебъгвал само на принт.
Титла: Re: странен тайминг
Публикувано от: jazzman в 01 Ноември 2016, 22:29:20
Оки, доки. Разбраф та ва  ;D

Аз си мислех, че ще мога да ползвам АVRISP-то през USB порта, но явно съм грешал. Ще те ъпдейтвам редовно като се сблъскам с нещо непознато и ново за мен :0
Титла: Re: странен тайминг
Публикувано от: kjufte в 02 Ноември 2016, 07:59:16
Ами нормална обърквация. Трябва да гледаш на всеки компонент като отделна система. Компа ти разговаря само с ivrisp-то през USB. Компа няма директна връзка с микроконтролера. За това и нямаш порт. От своя страна ivrisp-то разговаря с микроконтролера, но само през SPI-интерфейса. Така си ги и навързал двата компонента, свързвайки MISO, MOSI и SCK.
Ако ползваш UART ще трябва вместо това да свържеш RXD и TXD пиновете на микроконтролера със съответните пинове на хардуера с който ще има комуникация (примерно USB TTL).

Давай повече и по-често инфо за проекта. Ако може даже със снимков мат'рял и/или схеми. Барем запалиш повече хора по embedded programming.  :)
 
Титла: Re: странен тайминг
Публикувано от: jazzman в 02 Ноември 2016, 13:10:10
Поръчах го. Ако знаех, миналият месец ходих до Бостън и посетих Micro Center (http://www.microcenter.com/site/stores/cambridge.aspx). Там го видях, се чудих за кво ли може да ми потрябва :)