Author Topic: Arduino MEGA328P  (Read 2623 times)

Offline tha

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 788
    • View Profile
Re: Arduino MEGA328P
« Reply #64 on: October 11, 2017, 12:14:56 pm »
มาลองกับบอร์ด ET-STM32F103RB บ้าง ปรากฎว่า compile ได้บ้างไม่ได้บ้าง ลงโปรแกรมผ่าน serial port ก็ไม่ได้ ลงผ่าน usb port ก็ไม่เป็น 
ผ่านๆกันไปก่อน จะได้ขึ้น eeprom arduino mega328p กันต่อ


Offline tha

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 788
    • View Profile
Re: Arduino MEGA328P
« Reply #65 on: October 11, 2017, 04:37:05 pm »
Quote
มาลองกับบอร์ด ET-STM32F103RB บ้าง ปรากฎว่า compile ได้บ้างไม่ได้บ้าง ลงโปรแกรมผ่าน serial port ก็ไม่ได้ ลงผ่าน usb port ก็ไม่เป็น 
ผ่านๆกันไปก่อน จะได้ขึ้น eeprom arduino mega328p กันต่อ

ลง flash loader v1.1 ที่ได้มาจาก external harddisk ที่เก็บข้อมูลไว้ พอดีสาย usb มันชำรุด นึกว่ามันพังเสียแล้ว เปลี่ยนสาย usb ใหม่ก็ใช้ได้เป็นปกติ ข้อมูลเก่าที่เก็บไว้กลับคืนมาแล้ว

ลองเอาโปรแกรม HEX file โปรแกรมตัวอย่างไฟกระพริบโหลดผ่าน flash loader ผ่าน port rs232 usart1 เข้าไป ก็ทำงานได้แล้วครับ ไม่เสีย

ตอนแรกที่ไม่ได้คือ ผมไม่ได้กด reset หลังจากที่ on BOOT0 แล้ว ตอนนี้โอเครแล้ว ลอง arduino ide ก็ได้แล้ว
gcc arm gnu toolchain ผมลง version 4.8 2014q3 ตัวเก่า ไฟกระพริบก็ทำงานได้ปกติครับ
http://www.mediafire.com/file/s21wztvxvo3v9qn/Blink_stm32f103r.ino

Offline tha

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 788
    • View Profile
Re: Arduino MEGA328P
« Reply #66 on: October 11, 2017, 05:16:29 pm »
ขอบคุณที่เป็นธุระให้และคำแนะนำครับ บอร์ดยังใช้ได้ เอาเก็บไว้ก่อน มาเอาเรื่อง atmega328p กันต่อ  >:(

Offline tha

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 788
    • View Profile
Re: Arduino MEGA328P
« Reply #67 on: October 11, 2017, 06:59:57 pm »
12.6. Register Description

12.6.1. EEPROM Address Register High
เมื่อระบุที่อยู่ I/O Registers ราวกับเป็น data space โดยใช้ LD and ST instructions, การจัดให้มีระยะชดเชยต้องถูกใช้ เมื่อใช้ the I/O specific commands IN and OUT, the offset ถูกลดลง 0x20, เป็นผลให้ an I/O address offset อยูภายใน 0x00 - 0x3F.



12.6.2. EEPROM Address Register Low
เมื่อระบุที่อยู่ I/O Registers ราวกับเป็น data space โดยใช้ LD and ST instructions, การจัดให้มีระยะชดเชยต้องถูกใช้ เมื่อใช้ the I/O specific commands IN and OUT, the offset ถูกลดลง 0x20, เป็นผลให้ an I/O address offset อยูภายใน 0x00 - 0x3F.



Bits 7:0 – EEARn: EEPROM Address
The EEPROM Address Registers – EEARH and EEARL ระบุ the EEPROM address ใน the 1K Bytes EEPROM space. The EEPROM data bytes ถูกระบุตำแหน่งเป็นแนวระหว่าง 0 and 255/511/511. ค่าเริ่มต้นของ EEAR ไม่ถูกกำหนด. ค่าที่เหมาะสมต้องถูกเขียนก่อนที่ the EEPROM ถูกเข้าถึง.

12.6.3. EEPROM Data Register
เมื่อระบุที่อยู่ I/O Registers ราวกับเป็น data space โดยใช้ LD and ST instructions, การจัดให้มีระยะชดเชยต้องถูกใช้ เมื่อใช้ the I/O specific commands IN and OUT, the offset ถูกลดลง 0x20, เป็นผลให้ an I/O address offset อยูภายใน 0x00 - 0x3F.



Bits 7:0 – EEDR[7:0]: EEPROM Data
สำหรับการทำการเขียน the EEPROM , the EEDR Register บรรจุด้วย the data ที่จะถูกเขียนไปยัง the EEPROM ในตำแหน่ง the address ที่กำหนดโดย the EEAR Register. สำหรับการทำการ the EEPROM , the EEDR บรรจุ the data ที่อ่านออกจาก the EEPROM ที่ the address ที่ให้โดย EEAR.

12.6.4. EEPROM Control Register
เมื่อระบุที่อยู่ I/O Registers ราวกับเป็น data space โดยใช้ LD and ST instructions, การจัดให้มีระยะชดเชยต้องถูกใช้ เมื่อใช้ the I/O specific commands IN and OUT, the offset ถูกลดลง 0x20, เป็นผลให้ an I/O address offset อยูภายใน 0x00 - 0x3F.



Bits 5:4 – EEPMn: EEPROM Programming Mode Bits [n = 1:0]
The EEPROM Programming mode การตั้งบิทเพื่อกำหนด programming action ที่จะถูกทริกเมื่อเขียนEEPE. มันอาจจะโปรแกรมข้อมูลในการทำงานครั้งเดียว one atomic operation (ลบค่าเก่าและโปรแกรมค่าใหม่) หรือแตกออกเป็น the Erase และ Write operations ในสองการทำงานที่แตกต่างกัน. The Programming times สำหรับโหมดที่แตกต่างกันถูกแสดงในตารางข้างล่างนี้. ขณะที่ EEPE ถูกเซท, การเขียนอะไรต่างๆไปยัง EEPMn จะถูกเพิกเฉย. ในระหว่างที่ reset, the EEPMn bits จะถูก reset ให้เป็น 0b00 ถึงแม้ว่า the EEPROM กำลังโปรแกรมยุ่งอยู่ก็ตาม.



Bit 3 – EERIE: EEPROM Ready Interrupt Enable
การเขียน EERIE เป็นหนึ่งจะเปิดการใช้งาน the EEPROM Ready Interrupt ถ้า the I bit ใน SREG ถูกเซท. การเขียน EERIE ให้เป็นศูนย์จะปิดการใช้งาน the interrupt นี้. The EEPROM Ready interrupt จะทำให้เกิด a constant interrupt เมื่อ EEPE ถูกเคลียร์. The interrupt จะไม่เกิดขึ้นในระหว่างการเขียน EEPROM หรือ SPM.

Bit 2 – EEMPE: EEPROM Master Write Enable
The EEMPE bit เป็นตัวกำหนดว่า EEPE เมื่อเป็น '1' เป็นเหตุให้ the EEPROM ถูกเขียน. เมื่อ EEMPE เป็น '1', การเซท EEPE ภายใน four clock cycles จะเขียน data ไปยัง the EEPROM ที่ the selected address.

ถ้า EEMPE เป็น 0, การเซท EEPE จะไม่มีผลอะไร. เมื่อ EEMPE ถูกเขียนให้เป็น '1' โดย software, hardware จะเคลียร์บิทให้เป็น 0 หลังจาก four clock cycles. ดู the description of the EEPE bit สำหรับ an EEPROM write procedure.

Offline tha

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 788
    • View Profile
Re: Arduino MEGA328P
« Reply #68 on: October 12, 2017, 03:45:47 pm »
Bit 1 – EEPE: EEPROM Write Enable
The EEPROM Write Enable Signal EEPE คือ the write strobe ไปยัง the EEPROM. เมื่อ address และ data ถูก set up อย่างถูกต้อง, the EEPE bit ต้องถูกเขียนให้เป็น '1' เพื่อเขียนค่าไปใน the EEPROM. The EEMPE bit ต้องถูกเขียนให้เป็น '1' ก่อน EEPE ถูกเขียนเป็น '1', มิฉะนั้นไม่มีการเขียน EEPROM เกิดขึ้น. ขบวนการดังต่อไปนี้ควรทำตามเมื่อเขียน the EEPROM (ลำดับ steps 3 and 4 ไม่สำคัญ):

1. คอยจนบิท EEPE เป็น 0.
2. คอยจนบิท SPMEN ใน SPMCSR เป็น 0.
3. เขียน EEPROM address ค่าใหม่ไปยัง EEAR (ซึ่งเป็นทางเลือก).
4. เขียน EEPROM data ค่าใหม่ไปยัง EEDR (optional).
5. เขียน '1' ไปยัง the EEMPE bit ในขณะเขียน 0 ไปยัง EEPE ใน EECR.
6. ภายใน four clock cycles หลังจากการเซทบิท EEMPE, เขียน '1' ไปยังบิท EEPE.

The EEPROM ไม่สามารถโปรแกรมได้ในระหว่างที่ CPU เขียนไปยัง the Flash memory. The software ต้องเช็คว่า the Flash programming ถูกทำให้เสร็จก่อนเริ่มเขียน EEPROM ใหม่. Step 2 มีความสัมพันธ์เพียงถ้า the software บรรจุ a Boot Loader ยอมให้ the CPU ทำการโปรแกรม the Flash. ถ้า the Flash ไม่เคยมีการอัฟเดทโดย the CPU, step 2 สามารถข้ามได้.

Caution:
An interrupt ในระหว่าง step 5 และ step 6 จะทำให้ the write cycle ล้มเหลว, ดังนั้น the EEPROM Master Write Enable จะ time-out. ถ้า an
interrupt routine ที่เข้าถึง the EEPROM กำลัง interrupt การเข้าถึง EEPROM อื่นๆ, the EEAR หรือ EEDR Register จะถูกโมดิฟาย, เป็นเหตุให้ the interrupted EEPROM access ล้มเหลว. ขอสนับสนุนให้เคลียร์ the Global Interrupt Flag ในทุกๆ steps เพื่อหลีกเลี่ยงปัญหาเหล่านี้.

เมื่อ the write access time ได้ผ่านไป, the EEPE bit จะถูกเคลียร์โดย hardware. The user software สามารถวนตรวจสอบบิทนี้และคอยจนเป็น 0 ก่อนที่จะเขียนไบท์ต่อไป. เมื่อ EEPE ถูกเซท, the CPU จะหยุดเป็นเวลา two cycles ก่อนปฏิบัติคำสั่งต่อไป

Offline tha

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 788
    • View Profile
Re: Arduino MEGA328P
« Reply #69 on: October 13, 2017, 06:22:17 am »
Bit 0 – EERE: EEPROM Read Enable
The EEPROM Read Enable Signal EERE คือ the read strobe ไปยัง the EEPROM. เมื่อ the correct address ถูก set up ใน the EEAR Register, the EERE bit ต้องถูกเขียนให้เป็น '1' เพื่อทริกการอ่าน the EEPROM. The EEPROM read access ใช้เวลาหนึ่งคำสั่ง, และข้อมูลที่ต้องการสามารถใช้ประโยชน์ได้ทันที. เมื่อ the EEPROM ถูกอ่าน, the CPU จะหยุดเป็นเวลา four cycles ก่อนปฏิบัติคำสั่งถัดไป.

The user ควรวนตรวจ the EEPE bit ก่อนเริ่ม the read operation. ถ้า a write operation อยู่ในระหว่างทำงานก้าวหน้าอยู่, มันจะไม่สามารถที่จะอ่าน the EEPROM, ไม่สามารถที่จะเปลี่ยน the EEAR Register ได้.

The calibrated Oscillator ถูกใช้เพื่อให้เวลา the EEPROM accesses. ดูตารางดังต่อไปนี้เป็นแบบอย่าง typical programming times สำหรับ EEPROM access จาก the CPU.



The following code examples แสดง one assembly และ one C function สำหรับการเขียนไปยัง the EEPROM. The examples ทึกทักเอาว่า
interrupts ถูกควบคุม (ตัวอย่างเช่นปิดการใช้งาน interrupts globally) ดังนั้นไม่มี interrupts ใดจะเกิดขึ้นในระหว่างการปฏิบัติของหน้าที่เหล่านี้. The examples ทึกทักเอาว่าไม่มี Flash Boot Loader ถูกนำเสนอใน the software อีกด้วย. ถ้า code เช่นนี้ถูกนำเสนอ, the EEPROM write function ต้องคอยสำหรับ ongoing SPM command เสร็จสิ้นอีกด้วย




The next code examples แสดง one assembly และ one C function สำหรับการอ่านไปยัง the EEPROM. The examples ทึกทักเอาว่า interrupts ถูกควบคุม ดังนั้นไม่มี interrupts ใดจะเกิดขึ้นในระหว่างการปฏิบัติของหน้าที่เหล่านี้


Offline tha

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 788
    • View Profile
Re: Arduino MEGA328P
« Reply #70 on: October 13, 2017, 07:50:33 am »
ลองเอาตัวอย่าง arduino ของ ETT ที่มีมากับบอร์ด arduino leonardo มาทำ ก็ทำงานได้ครับ (เอาโปรแกรมมาโชว์นิดโชว์หน่อยไม่ว่ากันนะ ETT)
http://www.mediafire.com/file/wxbrwakjug4o6k9/EEPROM_INTERNAL_RS232.ino

เดี๋ยวจะลองใช้ C program read write ที่เขาให้มาใน data sheet นี้แทนฟังชั่น read and write ของ arduino ลองดูว่าจะทำงานได้ใหม เขาว่ายังไงนะ ต้องไม่มี interrupt กับไม่มีการเขียน Flash Boot Loader ใน software ด้วยใช่มั๊ย งงๆอยู่ เดี๋ยวมาลองกัน


Offline tha

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 788
    • View Profile
Re: Arduino MEGA328P
« Reply #71 on: October 13, 2017, 09:07:06 am »
เฮ อย่างนี้ก็ได้ด้วย ใช้ register ไปเลยก็ โอเคร http://www.mediafire.com/file/ffccie3v3zxn536/EEPROM_register_RS232.ino

ตัวอย่างลองย้ายไปเขียน eeprom ที่ address 512 เพื่อที่จะไม่ต้องเขียนลบซ้ำๆที่ address 0 จะได้ใช้ไปนานๆ eeprom นี่ทนเขียนลบ 100000 ครั้งใช่มั๊ย อย่างนี้เข้าใจถูกต้องใช่หรือเปล่า?